模板層 後端朝html頁面傳遞數據 兩種給html頁面傳遞數據的方式 第一種: render(request,'index.html',{'user_list':user_list}) 第二種 render(request,'index.html',locals()) 後端能夠給html傳遞的數據有哪些 python全部的基本數據類型 函數名(傳函數名會自動加括號執行) 對象(至關於在前端頁面打印了該對象) 前端訪問容器類型數據的屬性或方法統一採用句點符(.) 有序類型 直接點索引訪問 字典 直接點key 在調用函數或方法的時候不支持傳參 過濾器 n|length 統計長度 n|default:'不存在' n|date:'Y-m-d' n|filesizeformat n|slice:'0:8:2' n|truncatechars:10 n|truncatewords:10 n|add:1 n|safe 先後端取消轉義的方式 前端轉義 |safe 後端轉義 from django.utils.safestring import mark_safe() mark_safe("<h1>我是h1標籤</h1>") 標籤 {% for foo in user_list%} {{ foo }} {{ forloop }} {% empty %} 當傳遞給個人循環對象是個空的狀況下才會走empty下面的代碼塊 {% endfor %} {% if flag %} flag有值 {% elif tag %} tag有值 {% else %} 兩個都沒值 {% endif %} 前端模板語法for循環和if判斷也能夠嵌套使用 {% with hobby.2.1.2.1.2.3.4.3 as h%} {{ h }} {{ hobby.2.1.2.1.2.3.4.3 }} {% endwith %} 自定義過濾器,標籤,inclusion_tag 必備三步走戰略 1.在應用下新建一個名字必須叫作templatetags文件夾 2.在新建的文件夾下新建一個任意名的py文件(my_tag.py) 3.在新建的py文件中固定寫下面兩句話 from django import template register = template.Library() # 自定義過濾器 @register.filter(name='baby') def index(a,b): return a+b # 自定義標籤 @register.simple_tag(name='index') def index(a,b,c,d): return a+b+c+d # 自定義inclusion_tag @register.inclusion_tag('login.html',name='xxx') def index(n): # 產生login.html小頁面所須要的數據 return {"data":data} html中如何使用自定義的過濾器,標籤,inclusion_tag # 先加載 {% load my_tag %} {{ num|baby:10 }} {% index 1 2 3 4 %} {% xxx 10 %} 模板的繼承與導入 index.html {% block content %} 主頁內容 {% endblock %} 繼承模板 {% extends 'index.html'%} {% block content %} {{ block.super }} 子頁面內容 {% endblock %} 模板的導入 {% include 'login.html' %} ps:一個模板中一般block塊兒越多頁面的可擴展性越強 通常習慣性的取三塊兒內容 css content js 靜態文件配置 {% load static %} 兩種動態獲取路徑的方式 <link rel='stylesheet' href="{% static 'css/mycss.css'%}"> # 第一種方式 <link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css"> # 第二種方式 模型層 django ORM操做 關鍵性字段及參數 DateField 年月日 DateTimeField 年月日時分秒 auto_now:每次操做改數據都會自動更新時間 auto_now_add:新增數據的時候會將當前時間自動添加,後續的修改該字段不會自動更新 單獨的py文件測試ORM操做須要配置的參數 import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day58.settings") import django django.setup() from app01 import models # 這一句話必須在這下面導入 主要是queryset對象就能夠無限制的點queryset方法(*******************) models.User.objects.filter().filter().filter().count() 單表查詢 **********************************查詢方法****************************************** <1> all(): 查詢全部結果 <2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象 <3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個,若是符合篩選條件的對象超過一個或者沒有都會拋出錯誤。(源碼就去摟一眼~詮釋爲什麼只能是一個對象) <4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象 <5> order_by(*field): 對查詢結果排序('-id')/('price') <6> reverse(): 對查詢結果反向排序 >>>前面要先有排序才能反向 <7> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。 <8> first(): 返回第一條記錄 <9> last(): 返回最後一條記錄 <10> exists(): 若是QuerySet包含數據,就返回True,不然返回False <11> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行後獲得的並非一系列 model的實例化對象,而是一個可迭代的字典序列 <12> values_list(*field): 它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列 <13> distinct(): 從返回結果中剔除重複紀錄 返回queryset對象的方法 all() filter() exclude() order_by() reverse() distinct() values() 返回一個可迭代的字典序列 values_list() 返回一個可迭代的元祖序列 多表查詢 表與表之間的關係 一對一(OneToOneField):一對一字段不管建在哪張關係表裏面均可以,可是推薦建在查詢頻率比較高的那張表裏面 一對多(ForeignKey):一對多字段建在多的那一方 多對多(ManyToManyField):多對多字段不管建在哪張關係表裏面均可以,可是推薦建在查詢頻率比較高的那張表裏面 ps:如何判斷表與表之間究竟是什麼關係 換位思考 A能不能有多個B B能不能有多個A add() # 添加 set() # 修改 remove() # 不能接收可迭代對象 clear() # 清空 不用傳參 正向與反向的概念 正向查詢按字段,反向查詢按表名小寫... # 一對一 # 正向:author---關聯字段在author表裏--->authordetail 按字段 # 反向:authordetail---關聯字段在author表裏--->author 按表名小寫 # 查詢jason做者的手機號 正向查詢 # 查詢地址是 :山東 的做者名字 反向查詢 # 一對多 # 正向:book---關聯字段在book表裏--->publish 按字段 # 反向:publish---關聯字段在book表裏--->book 按表名小寫_set.all() 由於一個出版社對應着多個圖書 # 多對多 # 正向:book---關聯字段在book表裏--->author 按字段 # 反向:author---關聯字段在book表裏--->book 按表名小寫_set.all() 由於一個做者對應着多個圖書 # 查詢出版社是東方出版社出版的書籍 一對多字段的反向查詢 # publish_obj = models.Publish.objects.filter(name='東方出版社').first() # print(publish_obj.book_set) # app01.Book.None # print(publish_obj.book_set.all()) # 查詢做者jason寫過的全部的書 多對多字段的反向查詢 # author_obj = models.Author.objects.filter(name='jason').first() # print(author_obj.book_set) # app01.Book.None # print(author_obj.book_set.all()) # 查詢做者電話號碼是110的做者姓名 一對一字段的反向查詢 # authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first() # print(authordetail_obj.author.name) F與Q查詢 配置文件配置參數查看全部orm操做內部的sql語句 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }