Django學習筆記(3)--模板

模板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提供了一些變量可供使用。這些變量以下:

  • forloop.counter:當前循環的下標。以1爲起始值
  • forloop.counter0:當前循環的下標。以0爲起始值
  • forloop.revcounter:當前循環的方向下標值。好比列表有5個元素,那麼第一次遍歷這個屬性是等於5,第二次是4,以此類推。而且是以1做爲最後一個元素的下標。
  • forloop.first:是不是第一次遍歷。
  • forloop.last:是不是最後一次遍歷。
  • forloop.parentloop:若是有多個循環嵌套,那麼這個屬性表明的是上一級的for循環。

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語句定義的變量,只能在 {% with %} {% endwith %} 之間使用。
  • 定義變量的時候,不能在等號左右兩邊留有空格。好比 {% with list = person.1 %} 是錯誤的。
  • 還有另外一種寫法一樣也是支持的:
{% 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)
相關文章
相關標籤/搜索