模板css
在實際的頁面大可能是帶樣式的HTML代碼,而模板是一種帶有特殊語法的html文件,這個html文件能夠被django編譯,能夠傳遞參數進去, 實現數據動態化。在編譯完成後,生成一個普通的html文件,而後發送給客戶端。html
渲染模板:前端
1.render_to_string:找到模板,而後將模板編譯後渲染成python的字符串格式,最後再經過HttpResponse類包裝成一個HttpResponese對象返回回去。示例:python
from django.template.loader import render_to_string from django.http import HttpResponse def book_detail(request,book_id): return HttpResponse(render_to_string('detail.html'))
2.更方便的一種方法django
from django.shortcuts import render def book_detail(request): return render(request,'detail.html')
模板的查找路徑:緩存
在項目的settings.py文件中。有一個TEMPLATES的配置,這個配置包含了模板引擎配置,模板查找路徑的配置,模板上下文的配置等。模板路徑能夠再兩個地方配置。app
DIRS:這是一個列表,在這個列表中能夠存放全部的模板路徑,之後再視圖中使用render或者render_to_string渲染模板的時候,會在這個列表的路徑中查找模板。函數
APP_DIRS:默認爲True,這個設置爲True後,會在INSTALLED_APPS的安裝了的APP下的templates文件夾中查找模板。oop
查找順序:好比代碼render('list.html')。先會在DIRS這個列表中以此查找路徑下有沒有這個模板,若是有,就返回。若是DIRS列表中全部的路徑都沒有找到,那麼會先檢查當前這個視圖所處的aoo是否已經安裝,若是已經安裝了,那麼就先在當前這個app下的templates文件夾中查找模板,若是沒有找到,那麼在其餘已經安裝了的app中查找,若是全部路徑下都沒有找到,那麼會拋出一個TemplateDoesNotExist的異常。ui
模板中的變量
1.在模板中使用變量,須要將變量放到'{{ }}'中
2.若是想要訪問對象的屬性,那麼能夠經過'對象.屬性名'來訪問(列表元組也同樣)
class Person(object): def __init__(self,username): self.username=username p = Person('hah') context = { 'person':p } return render(request,'index.html',context=context)
3.若是想要訪問一個字典的key對應的value,那麼只能經過'字典.key'的方式進行訪問,不能經過'中括號[]'的形式進行訪問。
context = { 'person':{ 'username':'hah' } } {{ person.username }}
4.由於在訪問字典的'key'時候也是使用'點.'來訪問,所以不能在字典中定義字典自己就有的屬性名看成'key',不然字典的那個屬性將變成字典中的key了。
context = { 'person':{ 'username':'hah', 'keys':'abc' } }
5.若是想要訪問列表或者元組,那麼也是經過'點.'的方式進行訪問,不能經過'中括號[]'的形式進行訪問,
context = { 'person':[ 'hah','abc' ] } {{ person.1 }}
模板標籤
1.if標籤
if標籤至關於python中的if語句,有elif和else相對應,可是全部的標籤都須要用標籤符號{%%}進行包裹。if標籤中能夠試用 ==、!=、<、<=、>、>=、in、not in、is、is not等判斷運算符。示例:
{% if "張三" in person %} <p>張三</p> {% else %} <p>李四</p> {% endif %}
2.for...in...標籤
for...in...相似於python中的for...in...。能夠遍歷列表、元組、字符串、字典等一切能夠遍歷的對象。示例:
{% for person in persons %} <p>{{ person.name }}</p> {% endfor %}
若是想要反向遍歷,那麼在遍歷的時候就加上一個reversed。
{% for person in persons reversed %} <p>{{ person.name }}</p> {% endfor %}
遍歷字典的時候,須要使用items、key和values等方法。在DTL中,執行一個方法不能使用圓括號的形式。遍歷字典示例:
{% for key,value in person.items %} <p>key:{{ key }}</p> <p>value:{{ value }}</p> {% endfor %}
在for循環中,DTL提供了一些變量可供使用。這些變量以下:
3.for...in...empty標籤
這個標籤使用和for...in...是同樣的,只不過是在遍歷的對象若是沒有元素的狀況下,匯之星empty中的內容。示例:
{% for person in persons %} <li>{{ person }}</li> {% empty %} 暫時尚未任何人 {% endfor %}
4.with標籤
在模板中定義變量。有時候一個變量訪問的時候比較複雜,那麼能夠先把這個複雜的變量緩存到一個變量上,之後就能夠直接使用這個變量就能夠了。示例:
context = { 'person':{'張三','李四'} } {% with list=person.i %} <p>{{ list }}</p> {% endwith %}
有幾點須要注意:
{% with person.i as lisi %} <p>{{ lisi }}</p> {% endwith %}
5.url標籤
在模板中,咱們常常要寫一些url,好比某個a標籤中須要定義href屬性。固然若是經過硬編碼的方式直接將這個url寫死在裏面也是能夠的,可是這樣對與之後的項目維護不是一件好事。所以建議使用這種反轉的方式來實現,相似於django中的reverse同樣。示例:
<a href="{% url 'book' %}"></a>
path('book/',views.book,name='book')#urls.py
若是'url'反轉的時候須要傳遞參數,那麼能夠在後面傳遞。可是參數分位置參數和關鍵字參數。位置參數和關鍵字參數不能同時使用。示例代碼以下:
#path部分 path('detail/<book_id>/',views.book_detail,name='detail') #url反轉,使用位置參數 <a href="{% url 'book:detail' 1 %}">圖書詳情頁面</a> #url反轉,使用關鍵字參數 <a href="{% url 'book:detail' book_id=1 %}">圖書詳情頁面</a>
若是想要在使用'url'標籤反轉的時候要傳遞查詢字符串的參數,那麼必需要動手在後面添加。示例:
<a href="{% url 'book:detail' book_id=1 %}?page=1">圖書詳情頁面</a>
DTL過濾器
爲何使用過濾器:
由於在DTL中,不支持函數的調用形式'()',所以不能給函數傳遞參數,這將有很大的侷限性。而過濾器其實就是一個函數,能夠對須要處理的參數進行處理,而且還能夠額外接受一個參數(也就是說,最多隻能有2個參數)。
1.add過濾器:
將傳進的參數添加到原來的值上面。這個過濾器會嘗試將'值'和'參數'轉換成整型而後相加,若是不能轉換爲整型,則將兩者進行拼接,字符串會直接相加,列表會拼接成一個列表。示例:
{{ value|add:"2" }}#源代碼
def add(value,arg): try: return int(value) + int(arg) except(ValueError, TypeError): try: return value + arg except Exception: return ""
2.cut過濾器:
移除值中全部指定的字符串,相似於python中的replace(args,"")。示例:
{{ value|cut:" " }}
def cut(value, arg): safe = isinstance(value, SafeData) value = value.replace(arg, '') if safe and arg != ';': return mark_safe(value) return value
3.date
將一個日期按照指定的格式,格式化成字符串,示例:
from datetime import datetime
#數據 context = { "birthday": datetime.now() } #模板 {{ birthday|date:"Y/m/d" }}
格式字符 | 描述 |
Y | 四位數字的年份 |
m | 兩位數字的月份 |
n | 1-2位數字的月份 |
d | 兩位數字的天 |
j | 1-2位數字的天 |
g | 12小時格式的兩位數字的小時 |
h | 12小時格式的1-2爲數字的小時 |
G | 24小時格式的兩位數字的小時 |
H | 24小時格式的1-2位數字的小時 |
i | 2位數字的分鐘 |
s | 1-2位數字的分鐘 |
模板繼承
在前端頁面開發中,有些代碼是須要重複使用的,這種狀況能夠試用include標籤來實現。也可使用另一個比較強大的方式來實現,那就是模板繼承。模板繼承相似於python類的繼承,在父類中能夠先定義好一些變量和方法,而後在子類中實現。模板繼承也能夠再父模板中先定義好一些子模板須要用到的代碼,而後子模板直接繼承就能夠了,而且由於子模板確定有本身的不一樣代碼,所以可在父模板中定義一個block接口,而後子模板再去實現。示例:
父模板base.html .... <body> <div> {% block content %} {% endblock %} </div> </body ....
子模板
{% extends "base.html" %}
{% block content %}
........
{% endblock %}
須要注意的是:extends標籤必須放在模板的第一行;
子模板中的代碼必須放在block中,不然將不會被渲染。
若是某個"block"中須要使用父模板的內容,那麼能夠試用 {{ block.super }} 來繼承。
加載靜態文件
在一個網頁中,不只僅只有一個html骨架,還須要css樣式文件,js執行文件以及一些圖片等。所以在DTL中加載靜態文件是一個必需要解決的問題。在DTL中,使用static標籤來加載靜態文件。要使用static標籤,首先須要{% load static %}。加載靜態文件的步驟:
1.首先確保django.contrib.staticfiles已經添加到settings.INSTALLED_APPS中。(建立項目時已自動添加)
2.確保在settings.py中設置了STATIC_URL。(也已自動生成)
3.在已經安裝了的app下建立一個文件夾叫作static,而後再在這個static文件夾下建立一個當前app的名字的文件夾,再把靜態文件放到這個文件夾下。例如你的app叫作book,有一個靜態文件叫作xxx.jpg,那麼路徑爲book/static/xxx.jpg。
4.若是有一些靜態文件是不和任何app掛鉤的,那麼能夠在settings.py中添加STATICFILES_DIRS,之後DTL就會在這個列表的路徑中查找靜態文件。好比能夠設置爲:
STATICFILES_DIRS = [
os.path.join(BASE_DIR,"static")
]
5.在模板中使用load標籤加載static標籤,好比要加載在項目的static文件夾下的style.css的文件:
{% load static %} <link rel="stylesheet" href="{% static 'style.css' %}">
6.若是不想每次在模板中加載靜態文件都是用load加載static標籤,那麼能夠再settings.py中的TEMPLATES/OPTION添加'builtins':['django.templatetags.static'],這樣之後再模板中就能夠直接使用static標籤,而不是手動load了。
7.若是沒有在settings.INSTATTED_APPS中添加django.contrib.staticfiles。那麼咱們就須要手動請求靜態文件中的url與靜態文件的路徑進行映射了。示例:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ #其餘額url模板 ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)