django:模板

1.django模板 DTL(Django Template Language)

加載模板的2種方式
1.進(jìn)入虛擬環(huán)境 創(chuàng)建day3文件夾 創(chuàng)建項(xiàng)目djang_templates 在項(xiàng)目中創(chuàng)建app:book

(Django框架-M7PXHVMJ) E:\Django框架>cd day3

(Django框架-M7PXHVMJ) E:\Django框架\day3>django-admin startproject djang_templates

(Django框架-M7PXHVMJ) E:\Django框架\day3>cd djang_templates

(Django框架-M7PXHVMJ) E:\Django框架\day3\djang_templates>python 

manage.py startapp book

(Django框架-M7PXHVMJ) E:\Django框架\day3\djang_templates>python manage.py migrate

2.在app中創(chuàng)建urls.py文件,在項(xiàng)目總urls.py中配置app路由


image.png

3.在app中book.views.py 中定義2個(gè)函數(shù)
3.1.1 先導(dǎo)入2中方法,通過2中方法創(chuàng)建2個(gè)函數(shù)
a:from django.shortcuts import render
b: from django.template.loader import render_to_string
代碼如下:

from django.shortcuts import render
from django.http import HttpResponse
from django.template.loader import render_to_string


def index(request):
    # return HttpResponse('圖書首頁')
    html = render_to_string('index.html')
    return HttpResponse(html)
def book(request):
    return render(request, 'book.html')
image.png

4.在項(xiàng)目總文件夾下項(xiàng)目djang_templates 創(chuàng)建templates文件夾
在templates文件夾中創(chuàng)建2個(gè)對應(yīng)的html文件:index.html book.html
html的title修改為‘圖示首頁’ ‘book’ 以示區(qū)別


image.png

image.png

5.在項(xiàng)目setting.py中設(shè)置文件配置templates文件夾的路徑,以便找到此文件夾中的html文集。配置代碼如下:

'DIRS': [os.path.join(BASE_DIR, 'templates')]

image.png

6.啟動manage.py ,啟動前別忘記配置manage.py
image.png

7.瀏覽器中輸入訪問地址:
http://127.0.0.1:8000/book/
image.png

http://127.0.0.1:8000/book/book/
image.png

2. 模板的查詢路徑配置

在項(xiàng)目的settings.py文件中。有一個(gè)TEMPLATES配置,這個(gè)配置包含了模板引擎的配置,模板查找路徑的配置,模板上下文的配置等。模板路徑可以在兩個(gè)地方配置。
1.DIRS:這是一個(gè)列表,在這個(gè)列表中可以存放所有的模板路徑,以后在視圖中使用render或者render_to_string渲染模板的時(shí)候,會在這個(gè)列表的路徑中查找模板。


image.png

2.APP_DIRS:默認(rèn)為True,這個(gè)設(shè)置為True后,會在INSTALLED_APPS的安裝了的APP下的templates文件加中查找模板。settings.py中INSTALLED_APPS數(shù)組中添加你的app名字。


image.png

3.查找順序:比如代碼render('list.html')。先會在DIRS這個(gè)列表中依次查找路徑下有沒有這個(gè)模板,如果有,就返回。如果DIRS列表中所有的路徑都沒有找到,那么會先檢查當(dāng)前這個(gè)視圖所處的app是否已經(jīng)安裝,如果已經(jīng)安裝了,那么就先在當(dāng)前這個(gè)app下的templates文件夾中查找模板,如果沒有找到,那么會在其他已經(jīng)安裝了的app中查找。如果所有路徑下都沒有找到,那么會拋出一個(gè)TemplateDoesNotExist的異常。

3. DTL模板語法


class Dog(object):
    def __init__(self, name):
        self.name = name


def index(request):

   # return HttpResponse('圖書首頁')

    dog = Dog('中華田園犬')

    html = render_to_string('index.html')

    return HttpResponse(html)


def book(request):
    context = {'username': 'cheney',
               'books': ['san', 'shui', 'xi', 'hong'],
               'logo': {'name': 'logic'
                },
               'dog': Dog('中華田園犬'),
               }
    return render(request, 'book.html', context=context)

http://127.0.0.1:8000/book/book/

image.png

模板中的變量同樣也支持點(diǎn)(.)的形式。在出現(xiàn)了點(diǎn)的情況,比如person.username,模板是按照以下方式進(jìn)行解析的

1.如果person是一個(gè)字典,那么就會查找這個(gè)字典的username這個(gè)key對應(yīng)的值。
2.如果person是一個(gè)對象,那么就會查找這個(gè)對象的username屬性,或者是username這個(gè)方法。
3.如果出現(xiàn)的是person.1,會判斷persons是否是一個(gè)列表或者元組或者任意的可以通過下標(biāo)訪問的對象,
如果是的話就取這個(gè)列表的第1個(gè)值。如果不是就獲取到的是一個(gè)空的字符串。

4.常用模板標(biāo)簽

1.if標(biāo)簽:if標(biāo)簽相當(dāng)于Python中的if語句,有elif和else相對應(yīng),但是所有的標(biāo)簽都需要用標(biāo)簽符號({%%})進(jìn)行包裹。if標(biāo)簽中可以使用==、!=、<、<=、>、>=、in、not in、is、is not等判斷運(yùn)算符。

{% if age > 18 %}
    <p>您是成年人了</p>
{% elif age == 18 %}
    <p>您剛滿18歲</p>
{% else %}
    <p>您是未成年人</p>
{% endif %}

{% if "張三" in persons %}
    <p>張三</p>
{% else %}
    <p>李四</p>
{% endif %}

2.for...in...標(biāo)簽:for...in...類似于Python中的for...in...??梢员闅v列表、元組、字符串、字典等一切可以遍歷的對象。

{% for book in books %}
    <p>{{ book }}</p>
{% endfor %}

# 反向遍歷
{% for book in books reversed %}
    <p>{{ book }}</p>
{% endfor %}

遍歷字典的時(shí)候,需要使用items、keys和values等方法。在DTL中,執(zhí)行一個(gè)方法不能使用圓括號的形式。

{% for key,value in person.items %}
    <p>key:{{ key }}</p>
    <p>value:{{ value }}</p>
{% endfor %}

在for循環(huán)中,DTL提供了一些變量可供使用。

forloop.counter:當(dāng)前循環(huán)的下標(biāo)。以1作為起始值。
forloop.counter0:當(dāng)前循環(huán)的下標(biāo)。以0作為起始值。
forloop.revcounter:當(dāng)前循環(huán)的反向下標(biāo)值。比如列表有5個(gè)元素,那么第一次遍歷這個(gè)屬性是等于5,第二次是4,以此類推。并且是以1作為最后一個(gè)元素的下標(biāo)。
forloop.revcounter0:類似于forloop.revcounter。不同的是最后一個(gè)元素的下標(biāo)是從0開始。
forloop.first:是否是第一次遍歷。
forloop.last:是否是最后一次遍歷。
forloop.parentloop:如果有多個(gè)循環(huán)嵌套,那么這個(gè)屬性代表的是上一級的for循環(huán)。

3.for...in...empty標(biāo)簽:這個(gè)標(biāo)簽使用跟for...in...是一樣的,只不過是在遍歷的對象如果沒有元素的情況下,會執(zhí)行empty中的內(nèi)容。

{% for person in persons %}
    <li>{{ person }}</li>
{% empty %}
    暫時(shí)還沒有任何人
{% endfor %}

注意:在for循環(huán)中,break,continue語句是用不了的。

4.url標(biāo)簽:在模版中,我們經(jīng)常要寫一些url,比如某個(gè)a標(biāo)簽中需要定義href屬性。當(dāng)然如果通過硬編碼的方式直接將這個(gè)url寫死在里面也是可以的。但是這樣對于以后項(xiàng)目維護(hù)可能不是一件好事。因此建議使用這種反轉(zhuǎn)的方式來實(shí)現(xiàn),類似于django中的reverse一樣。
<a href="{% url 'book:list' %}">圖書列表頁面</a>

如果url反轉(zhuǎn)的時(shí)候需要傳遞參數(shù),那么可以在后面?zhèn)鬟f。但是參數(shù)分位置參數(shù)和關(guān)鍵字參數(shù)。位置參數(shù)和關(guān)鍵字參數(shù)不能同時(shí)使用。

# path部分
path('detail/<book_id>/',views.book_detail,name='detail')

# url反轉(zhuǎn),使用位置參數(shù)
<a href="{% url 'book:detail' 1 %}">圖書詳情頁面</a>

# url反轉(zhuǎn),使用關(guān)鍵字參數(shù)
<a href="{% url 'book:detail' book_id=1 %}">圖書詳情頁面</a>

如果想要在使用url標(biāo)簽反轉(zhuǎn)的時(shí)候要傳遞查詢字符串的參數(shù),那么必須要手動在在后面添加。

<a href="{% url 'book:detail' book_id=1 %}?page=1">圖書詳情頁面</a>

如果需要傳遞多個(gè)參數(shù),那么通過空格的方式進(jìn)行分隔。

<a href="{% url 'book:detail' book_id=1 page=2 %}">圖書詳情頁面</a>

more detail please refer:
(https://docs.djangoproject.com/en/2.0/ref/templates/builtins/)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Django視圖函數(shù)不只是直接返回文本,在實(shí)際生產(chǎn)環(huán)境中其實(shí)很少這樣使用,因?yàn)閷?shí)際的頁面大多是帶有樣式的HTML代...
    成長之路丶閱讀 394評論 0 0
  • 模板 作為Web框架,Django提供了模板,用于編寫html代碼,還可以嵌入模板代碼更快更方便的完成頁面開發(fā),再...
    錦魚閱讀 2,363評論 0 0
  • 目前市面上有非常多的模板系統(tǒng),其中最知名最好用的就是DTL和Jinja2。DTL是Django Template ...
    小短腿電工閱讀 585評論 0 0
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    余生動聽閱讀 10,869評論 0 11
  • 彩排完,天已黑
    劉凱書法閱讀 4,482評論 1 3

友情鏈接更多精彩內(nèi)容