在django的models.py 中,咱們定義了一些choices的元組,相似一些字典值,通常都是下拉框或者單多選框,例如 0對應男 1對應女等。html
class Area(models.Model): Area_Level = ( (0, u‘全國‘), (1, u‘省、直轄市‘), (2, u‘市、直轄市區‘), (3, u‘區、縣等‘), ) areaname = models.CharField(max_length=30,unique=True, verbose_name=‘區域名稱‘) code = models.CharField(max_length=20,blank=True, default="", verbose_name=‘區域代碼‘) parentid = models.IntegerField(verbose_name=‘父級id‘, null=True) level = models.IntegerField(choices=Area_Level,verbose_name=‘層級‘, null=True)
若是咱們想要在HTML中顯示choice中的字段值,採用{{ obj.level }} 獲得的只是數字0,1,2,3 ,若是咱們想要的到’全國’、’省、直轄市’、等字段,須要採用get_FOO_display方法:前端
{{ obj.get_level_display}}
bj.get_字段名稱_display 。python
未完待續web
def addcedtiorustomer(request, n=None): old_obj = models.Customer.objects.filter(pk=n).first() label = '編輯頁面' if n else '添加頁面' #三元運算符 根據 n的值進行 if request.method == 'GET': book_form_obj = myform.customermodelform(instance=old_obj) print(book_form_obj) return render(request, 'customer/addcustomer.html', {"book_form_obj": book_form_obj, 'label': label}) else: book_form_obj = myform.customermodelform(request.POST, instance=old_obj) if book_form_obj.is_valid(): book_form_obj.save() return redirect('customer') else: return render(request, 'customer/addcustomer.html', {'book_form_obj': book_form_obj, 'label': label})
{% extends 'starter.html' %} {% block title %} <h1>{{ label }}</h1> {# <h1>編輯客戶頁面</h1>#} {% endblock %} {% block context %} {% include 'customer/add_edit_mode.html' %} {% endblock %} add_edit_mode.html
小技巧django
使用request.get._mutable=ture 把quersetDIct是不可變app
request.GET出來的是queryset類型的數據 想要轉換成python類型的對象須要進行轉換 (self, query_string=None, mutable=False, encoding=None): request.GET._mutable須要把這個屬性改成False 1.強制轉換 request.GET._mutable=Ture 爲了引出copy的做用(禁止使用) 2. import copy recv_data = copy.copy(request.GET) print(type(recv_data)) #使用copy 進行QueryDict(不可變)變爲可變類型 ·······················request.py源碼······················· def __copy__(self): result = self.__class__('', mutable=True, encoding=self.encoding) for key, value in six.iterlists(self): result.setlist(key, value) return result def __deepcopy__(self, memo): result = self.__class__('', mutable=True, encoding=self.encoding) memo[id(self)] = result for key, value in six.iterlists(self): result.setlist(copy.deepcopy(key, memo), copy.deepcopy(value, memo)) return result
**{serch_field:keyword}#出來的關鍵字 **{serch_field+'__contains':keyword}#字符串的拼接 這個想法比較侷限不能多條件查詢
流程 1.由於雙下模糊查詢只能根據單個字段進行匹配 因此正常使用是根據字段雙下寫 例如 #name__contains=search_name 2.若是要使用想根據本身篩選的值進行變更 須要用 #Q()查詢 使用 1.q=Q()實例化對象 2.根據實例化對象進行字段替換 #把name__contains 換成傳入的search值 search__contains #能夠根據本身傳入的字段進行替換 <option value="qq__contains">qq</option> <option value="name__contains">姓名</option> html 傳值 <div class="form-group"> <select name="search_field" id="" class="form-control"> <option value="qq__contains">qq</option> <option value="name__contains">姓名</option> </select> <input type="text" class="form-control" id="search-word" placeholder="請輸入" name="keyword"> </div> view寫法 #單Q的使用 q=Q() q.children.append([search,search_name]) #根據name對應的values值篩選 all_customers = models.Customer.objects.filter(q) #多Q的使用 q=Q() q.connector = 'or'#指定q對象中的查詢條件的鏈接符,或的關係,默認是and q.children.append([search,search_name]) all_customers = models.Customer.objects.filter(Q(name__contains=search_name)) all_customers = models.Customer.objects.filter(Q(name__contains=search_name)) all_customers = models.Customer.objects.filter(q) ······················Q查詢源碼···························· class Q(tree.Node): """ Encapsulates filters as objects that can then be combined logically (using `&` and `|`). """ # Connection types AND = 'AND' OR = 'OR' default = AND
recv=request.GET 取出的是一個字典 <QueryDict: {'page': ['2'], 'selectChoice': ['name__contains'], 'filter2': ['liye']}> request.GET.urlencode() 取出除了路徑以外的全部url路徑(?以後的) http://127.0.0.1:8000/customer/?selectChoice=qq__contains&filter2=333
路徑不加/?page 直接變成路徑 127.0.0.1/?page 不加/ ?page=1 是當前頁拼接查詢 divmod(5,2)#(2,1)商和餘數 current——page 取出來的數 ?page=?。
view.pydom
def customer(request): select_form = myform.selectcustomerForm() current_page_number = request.GET.get('page') # 當前頁碼 search = request.GET.get('selectChoice') search_name = request.GET.get('filter2') print(current_page_number) print(search) print(search_name) # search_url=request.GET.urlencode() all_customers = models.Customer.objects.all() if search_name: q = Q() q.children.append([search, search_name]) all_customers = models.Customer.objects.filter(q) print('老師', all_customers) total_count = all_customers.count() per_page_count = settings.PER_PAGE_COUNT page_number_show = settings.PAGE_NUMBER_SHOW page_obj = DQPage(current_page_number, total_count, per_page_count, page_number_show) all_customers = all_customers[page_obj.start_data_number:page_obj.end_data_number] # 顯示頁面經過切片的形式 頁碼 page_html = page_obj.page_html_func() return render(request, 'customer/customer.html', { 'all_customers': all_customers, 'page_html': page_html, 'select_form': select_form, })
查詢不到返回空 不寫返回就會查出負索引報錯 @property def start_data_number(self): if not self.current_page_number: return 0 return (self.current_page_number - 1) * self.per_page_count @property def end_data_number(self): if not self.current_page_number: return 0 return self.current_page_number * self.per_page_count def page_html_func(self): 完整寫法 ···········································
from django.utils.safestring import mark_safe#django內置封裝了一個組件 至關於過濾器 '<h1>333</h1>|safe'識別字符串標籤 class DQPage: # self,current_page_number,total_count,per_page_count=10,page_number_show=7 傳參封裝屬性 def __init__(self, current_page_number, total_count, per_page_count=10, page_number_show=7): """ :param current_page_number: 當前頁碼 :param total_count: 總數據量 :param per_page_count: 每頁顯示多少條 :param page_number_show: 總共顯示多少個頁碼 total_page_count:總頁碼數 start_page_number:起始頁碼 end_page_number:結束頁碼 """ try: current_page_number = int(current_page_number) except Exception: current_page_number = 1 half_number = page_number_show // 2 a, b = divmod(total_count, per_page_count) # 若是餘數不爲0,頁碼總數爲商+1 if b: total_page_count = a + 1 else: total_page_count = a # total_page_count 最大頁數 # 當前頁碼小於等於0的時候,默認顯示第一頁 if current_page_number <= 0: current_page_number = 1 # 若是當前頁碼數大於最大頁碼數 就默認最大頁碼數 if current_page_number >= total_page_count: current_page_number = total_page_count # current_page_number 2 # print(total_page_count) # 2 #先後分爲 123 4 567 4爲當前頁碼 防止若是選到3產生 012 3 456 start_page_number = current_page_number - half_number # end_page_number = current_page_number + half_number + 1 # 6 # 若是起始頁面小於0 直接 默認顯示第一頁 if start_page_number <= 0: start_page_number = 1 end_page_number = page_number_show + 1 # 7 # 若是結束頁面大於總頁數 或者遠超最大頁碼的現象 總共25 顯示 22,23,24 25 26,27,28 if end_page_number >= total_page_count: # 6 > 2 start_page_number = total_page_count - page_number_show + 1 # -4 end_page_number = total_page_count + 1 # 3 #若是選擇只有兩條數據 不該該使用多分頁方式 if total_page_count < page_number_show: start_page_number = 1#起始頁碼數 end_page_number = total_page_count + 1#結束頁碼數 # 把對應的數據封裝在對象屬性中 self.current_page_number = current_page_number self.per_page_count = per_page_count self.total_page_count = total_page_count self.start_page_number = start_page_number self.end_page_number = end_page_number @property def start_data_number(self): if not self.current_page_number: return 0 return (self.current_page_number - 1) * self.per_page_count @property def end_data_number(self): if not self.current_page_number: return 0 return self.current_page_number * self.per_page_count def page_html_func(self): page_html = """ <nav aria-label="Page navigation"> <ul class="pagination"> """ first_page = f""" <li> <a href="?page={1}" aria-label="Previous"> <span aria-hidden="true">首頁</span> </a> </li>""" page_html += first_page previous_page = f""" <li> <a href="?page={self.current_page_number - 1}" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li>""" page_html += previous_page for i in range(self.start_page_number, self.end_page_number): if i == self.current_page_number: page_html += f'<li class="active"><a href="?page={i}">{i}</a></li>' else: page_html += f'<li><a href="?page={i}">{i}</a></li>' next_page = f""" <li> <a href="?page={self.current_page_number + 1}" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> """ page_html += next_page last_page = f""" <li> <a href="?page={self.total_page_count}" aria-label="Previous"> <span aria-hidden="true">尾頁</span> </a> </li>""" page_html += last_page page_html += """ </ul> </nav> """ return mark_safe(page_html)
1.若是 查詢出來的條件知足 就把page 拼接出來的字段在路徑裏 2.就進行替換處理 http://127.0.0.1:8000/customer/? page=2&selectChoice=name__contains&filter2=liye recv_data.urlencode() #出來的值就是 page=2&selectChoice=name__contains&filter2=liye #不然就 不進行篩選 傳遞原來的值 page_html += f"""<li><a href="?page={i}&{ self.recv_data.urlencode().replace('page='+str(self.current_page_number)+'&','') if 'page=' in self.recv_data.urlencode() else self.recv_data.urlencode() }">{i}</a></li>"""
添加的功能 import copy recv_data = copy.copy(request.GET) print(type(recv_data)) #<class 'django.http.request.QueryDict'> # from django.http.request import QueryDict
from django.utils.safestring import mark_safe class DQPage: def __init__(self,current_page_number,total_count,per_page_count=10,page_number_show=7,recv_data=None): """ :param current_page_number: 當前頁碼 :param total_count: 總數據量 :param per_page_count: 每頁顯示多少條 :param page_number_show: 總共顯示多少個頁碼 start_page_number:起始頁碼 end_page_number:結束頁碼 """ self.recv_data = recv_data try: current_page_number = int(current_page_number) except Exception: current_page_number = 1 half_number = page_number_show // 2 a, b = divmod(total_count, per_page_count) # 若是餘數不爲0,頁碼總數爲商+1 if b: total_page_count = a + 1 else: total_page_count = a # total_page_count 最大頁數 # 噹噹前頁碼小於等於0的時候,默認顯示第一頁 if current_page_number <= 0: current_page_number = 1 if current_page_number >= total_page_count: current_page_number = total_page_count # current_page_number 2 # print(total_page_count) # 2 start_page_number = current_page_number - half_number # end_page_number = current_page_number + half_number + 1 # 6 if start_page_number <= 0: start_page_number = 1 end_page_number = page_number_show + 1 # 7 if end_page_number >= total_page_count: # 6 > 2 start_page_number = total_page_count - page_number_show + 1 # -4 end_page_number = total_page_count + 1 # 3 if total_page_count < page_number_show: start_page_number = 1 end_page_number = total_page_count + 1 self.current_page_number = current_page_number self.per_page_count = per_page_count self.total_page_count = total_page_count self.start_page_number = start_page_number self.end_page_number = end_page_number @property def start_data_number(self): return (self.current_page_number - 1) * self.per_page_count @property def end_data_number(self): return self.current_page_number*self.per_page_count def page_html_func(self): page_html = """ <nav aria-label="Page navigation"> <ul class="pagination"> """ self.recv_data['page'] = 1 first_page = f""" <li> <a href="?{self.recv_data.urlencode()}" aria-label="Previous"> <span aria-hidden="true">首頁</span> </a> </li>""" page_html += first_page self.recv_data['page'] = self.current_page_number - 1 previous_page = f""" <li> <a href="?{self.recv_data.urlencode()}" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li>""" page_html += previous_page for i in range(self.start_page_number,self.end_page_number): self.recv_data['page'] = i # #<QueryDict: {'search_field': ['qq__contains'], 'keyword': ['123'],'page':'1'}> #page=2&search_field=qq__contains&keyword=12 if i == self.current_page_number: page_html += f'<li class="active"><a href="?{self.recv_data.urlencode()}">{i}</a></li>' else: # page=2&search_field=qq__contains&keyword=123 # page_html += f"""<li><a href="?page={i}&{ self.recv_data.urlencode().replace('page='+str(self.current_page_number)+'&','') if 'page=' in self.recv_data.urlencode() else self.recv_data.urlencode() }">{i}</a></li>""" page_html += f"""<li><a href="?{self.recv_data.urlencode()}">{i}</a></li>""" self.recv_data['page'] = self.current_page_number + 1 next_page = f""" <li> <a href="?{self.recv_data.urlencode()}" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> """ page_html += next_page self.recv_data['page'] = self.total_page_count last_page = f""" <li> <a href="?{self.recv_data.urlencode()}" aria-label="Previous"> <span aria-hidden="true">尾頁</span> </a> </li>""" page_html += last_page page_html += """ </ul> </nav> """ return mark_safe(page_html)
增長功能 for i in range(self.start_page_number,self.end_page_number): self.recv_data['page'] = i # #<QueryDict: {'search_field': ['qq__contains'], 'keyword': ['123'],'page':'1'}> 完整版數據 from django.utils.safestring import mark_safe class DQPage: def __init__(self,current_page_number,total_count,per_page_count=10,page_number_show=7,recv_data=None): """ :param current_page_number: 當前頁碼 :param total_count: 總數據量 :param per_page_count: 每頁顯示多少條 :param page_number_show: 總共顯示多少個頁碼 start_page_number:起始頁碼 end_page_number:結束頁碼 """ self.recv_data = recv_data try: current_page_number = int(current_page_number) except Exception: current_page_number = 1 half_number = page_number_show // 2 a, b = divmod(total_count, per_page_count) # 若是餘數不爲0,頁碼總數爲商+1 if b: total_page_count = a + 1 else: total_page_count = a # total_page_count 最大頁數 # 噹噹前頁碼小於等於0的時候,默認顯示第一頁 if current_page_number <= 0: current_page_number = 1 if current_page_number >= total_page_count: current_page_number = total_page_count # current_page_number 2 # print(total_page_count) # 2 start_page_number = current_page_number - half_number # end_page_number = current_page_number + half_number + 1 # 6 if start_page_number <= 0: start_page_number = 1 end_page_number = page_number_show + 1 # 7 if end_page_number >= total_page_count: # 6 > 2 start_page_number = total_page_count - page_number_show + 1 # -4 end_page_number = total_page_count + 1 # 3 if total_page_count < page_number_show: start_page_number = 1 end_page_number = total_page_count + 1 self.current_page_number = current_page_number self.per_page_count = per_page_count self.total_page_count = total_page_count self.start_page_number = start_page_number self.end_page_number = end_page_number @property def start_data_number(self): return (self.current_page_number - 1) * self.per_page_count @property def end_data_number(self): return self.current_page_number*self.per_page_count def page_html_func(self): page_html = """ <nav aria-label="Page navigation"> <ul class="pagination"> """ self.recv_data['page'] = 1 first_page = f""" <li> <a href="?{self.recv_data.urlencode()}" aria-label="Previous"> <span aria-hidden="true">首頁</span> </a> </li>""" page_html += first_page self.recv_data['page'] = self.current_page_number - 1 previous_page = f""" <li> <a href="?{self.recv_data.urlencode()}" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li>""" page_html += previous_page for i in range(self.start_page_number,self.end_page_number): self.recv_data['page'] = i # #<QueryDict: {'search_field': ['qq__contains'], 'keyword': ['123'],'page':'1'}> #page=2&search_field=qq__contains&keyword=12 if i == self.current_page_number: page_html += f'<li class="active"><a href="?{self.recv_data.urlencode()}">{i}</a></li>' else: # page=2&search_field=qq__contains&keyword=123 # page_html += f"""<li><a href="?page={i}&{ self.recv_data.urlencode().replace('page='+str(self.current_page_number)+'&','') if 'page=' in self.recv_data.urlencode() else self.recv_data.urlencode() }">{i}</a></li>""" page_html += f"""<li><a href="?{self.recv_data.urlencode()}">{i}</a></li>""" self.recv_data['page'] = self.current_page_number + 1 next_page = f""" <li> <a href="?{self.recv_data.urlencode()}" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> """ page_html += next_page self.recv_data['page'] = self.total_page_count last_page = f""" <li> <a href="?{self.recv_data.urlencode()}" aria-label="Previous"> <span aria-hidden="true">尾頁</span> </a> </li>""" page_html += last_page page_html += """ </ul> </nav> """ return mark_safe(page_html)
import copy recv_data = copy.copy(request.GET) print(type(recv_data)) #<class 'django.http.request.QueryDict'> # from django.http.request import QueryDict
<div class="form-group"> <select name="search_field" id="" class="form-control"> <option value="qq__contains">qq</option> <option value="name__contains">姓名</option> </select> <input type="text" class="form-control" id="search-word" placeholder="請輸入" name="keyword"> </div>
步驟 1.把查詢的對象放入字典裏一次性傳入前端進行交互 # bulk_create # django外部文件使用django環境 import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "IGnb.settings") import django django.setup() import random from sales import models sex_type = (('male', '男性'), ('female', '女性')) # source_type = (('qq', "qq羣"), ('referral', "內部轉介紹"), ('website', "官方網站"), ('baidu_ads', "百度推廣"), ('office_direct', "直接上門"), ('WoM', "口碑"), ('public_class', "公開課"), ('website_luffy', "路飛官網"), ('others', "其它"),) course_choices = (('LinuxL', 'Linux中高級'), ('PythonFullStack', 'Python高級全棧開發'),) print(random.choice(sex_type)) obj_list = [] for i in range(251): obj = models.Customer( qq=f"{i+1}236798", name=f'liye{i}', sex=random.choice(sex_type)[0], source=random.choice(source_type)[0], course=random.choice(course_choices)[0], ) obj_list.append(obj) models.Customer.objects.bulk_create(obj_list)
from django.utils.safestring import mark_safe class DQPage: #self,current_page_number,total_count,per_page_count=10,page_number_show=7 傳參封裝屬性 def __init__(self,current_page_number,total_count,per_page_count=10,page_number_show=7): """ :param current_page_number: 當前頁碼 :param total_count: 總數據量 :param per_page_count: 每頁顯示多少條 :param page_number_show: 總共顯示多少個頁碼 total_page_count:總頁碼數 start_page_number:起始頁碼 end_page_number:結束頁碼 """ #防止輸入的頁碼爲不是數字類型 try: current_page_number = int(current_page_number) except Exception: current_page_number = 1 half_number = page_number_show // 2 a, b = divmod(total_count, per_page_count) # 若是餘數不爲0,頁碼總數爲商+1 if b: total_page_count = a + 1 else: total_page_count = a # total_page_count 最大頁數 #當前頁碼小於等於0的時候,默認顯示第一頁 if current_page_number <= 0: current_page_number = 1 #若是當前頁碼大於最大頁碼就顯示最大頁碼 if current_page_number >= total_page_count: current_page_number = total_page_count # current_page_number 2 # print(total_page_count) # 2 start_page_number = current_page_number - half_number # end_page_number = current_page_number + half_number + 1 # 6 #若是起始頁面小於0 直接 默認顯示第一頁 if start_page_number <= 0: start_page_number = 1 end_page_number = page_number_show + 1 # 7 #若是結束頁碼大於總頁面 最大頁碼減去 每頁顯示的頁碼 是起始頁碼 if end_page_number >= total_page_count: # 6 > 2 start_page_number = total_page_count - page_number_show + 1 # -4 end_page_number = total_page_count + 1 # 3 #總頁碼 不足要求的頁碼數 if total_page_count < page_number_show: start_page_number = 1 end_page_number = total_page_count + 1 #把對應的數據封裝在對象屬性中 self.current_page_number = current_page_number self.per_page_count = per_page_count self.total_page_count = total_page_count self.start_page_number = start_page_number self.end_page_number = end_page_number @property#把起始頁碼封裝到一個僞屬性方法 def start_data_number(self): return (self.current_page_number - 1) * self.per_page_count @property#把最後頁碼封裝到一個僞屬性方法 def end_data_number(self): return self.current_page_number*self.per_page_count def page_html_func(self): page_html = """ <nav aria-label="Page navigation"> <ul class="pagination"> """ first_page = f""" <li> <a href="?page={1}" aria-label="Previous"> <span aria-hidden="true">首頁</span> </a> </li>""" page_html += first_page previous_page = f""" <li> <a href="?page={self.current_page_number - 1}" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li>""" page_html += previous_page for i in range(self.start_page_number,self.end_page_number): if i == self.current_page_number: #把每一頁都循環出來 變成當前打印的數量 #current_page_number當前頁 page_html += f'<li class="active"><a href="?page={i}">{i}</a></li>' else: page_html += f'<li><a href="?page={i}">{i}</a></li>' next_page = f""" <li> <a href="?page={self.current_page_number + 1}" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> """ page_html += next_page last_page = f""" <li> <a href="?page={self.total_page_count}" aria-label="Previous"> <span aria-hidden="true">尾頁</span> </a> </li>""" page_html += last_page page_html += """ </ul> </nav> """ return mark_safe(page_html)