Django(二) 模板:基本使用、模板語法、模板繼承

1、模板的使用實戰

接:https://blog.csdn.net/u010132177/article/details/103788677 參考:https://docs.djangoproject.com/zh-hans/3.0/contents/ https://docs.djangoproject.com/zh-hans/3.0/intro/overview/#write-your-viewshtml

1)建立模板文件夾templates

  • 在項目根目錄下建立【/templates/app1/index.html】文件及目錄 /templates/index.html 文件代碼:
<!--花括號內是變量名,對應views.py中的字典鍵名-->
<h1>{{ hello }}----{{wa}}</h1>

從模板中咱們知道變量使用了雙括號。python

2)在settings.py中配置模板路徑

  • 接下來咱們須要向Django說明模板文件的路徑,修改project1/settings.py,修改 TEMPLATES 中的 DIRS 爲 [BASE_DIR+"/templates",][os.path.join(BASE_DIR,'templates')],,以下所示:

/project1/settings.py 文件代碼:django

...TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR+"/templates",],    # 修改位置 或[os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
...

注:BASE_DIR來自前面定義,即當前項目的絕對路徑: BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))app

3)在視圖中渲染模板

  • 咱們如今修改 view.py,增長一個新的對象,用於向模板提交數據 【1】定義1個字典 【2】向字典寫一個鍵:值(hello:'hello world!!') 【3】返回:把context渲染到app1/index.html的模板文件 /project1/view.py 文件代碼:
from django.shortcuts import render #渲染模塊
#from django.http import HttpResponse
# Create your views here.

def index(request): # request爲必備參數
    context={} #【1】定義1個字典
    context['hello']='hello world!!!' #【2】向字典寫一個鍵:值(hello:'hello world!!')
    context['wa']='wawawawawahahahaha!'
    return render(request,'app1/index.html',context) #【3】返回:把context渲染到app1/index.html的模板文件
    #return HttpResponse('hello python!')
  • 能夠看到,咱們這裏使用 render 來替代以前使用的 HttpResponse。render 還使用了一個字典 context 做爲參數。
  • context 字典中元素的鍵值 "hello" 對應了模板中的變量 "{{ hello }}"。

效果:再訪問訪問 http://127.0.0.1:8000/app1:

hello world!----wawawawawahahahaha!測試

  • 這樣咱們就完成了使用模板來輸出數據,從而實現數據與視圖分離。

2、模板中經常使用的語法規則

2.0先看一個在模板循環列表的實例

1)app1/views.py

【2.2】定義一個字典值爲一個列表,list爲把內容轉換爲列表spa

from django.shortcuts import render

def index(request):
    context={} #【1】定義1個字典
    context['hello']='hello world!!!' #【2】向字典寫一個鍵:值(hello:'hello world!!')
    context['wa']='wawawawawahahahaha!'
    context['list']=list(range(1,10)) #【2.2】定義一個字典值爲一個列表,list爲把內容轉換爲列表
    return render(request,'app1/index.html',context) #【3】返回:把context渲染到app1/index.html的模板文件

2)templates/app1/index.html

重點:【循環出列表】.net

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>app1模板首頁</title>
</head>
<body>
<!--括號內是變量名,對應views.py中的字典鍵名-->
<h1 style="color:red">{{ hello }}----{{wa}}</h1>
<br/>
【循環出列表】:{{list}}
<ul>
    {% for i in list %}
    <li>{{i}}</li>
    {% endfor %}
</ul>

</body>
</html>

3)效果

在這裏插入圖片描述

2.1 if/else 標籤

基本語法格式以下:

{% if condition %}
     ... display
{% endif %}

# 或者:

{% if condition1 %}
   ... display 1
{% elif condition2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

根據條件判斷是否輸出。if/else 支持嵌套。

{% if %} 標籤接受 and , or 或者 not 關鍵字來對多個變量作判斷 ,或者對變量取反( not ),例如:debug

{% if athlete_list and coach_list %}
     athletes 和 coaches 變量都是可用的。
{% endif %}

2.2 for 標籤

{% for %} 容許咱們在一個序列上迭代。

與Python的 for 語句的情形相似,循環語法是 for X in Y ,Y是要迭代的序列而X是在每個特定的循環中使用的變量名稱。 每一次循環中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的全部內容。 例如,給定一個運動員列表 athlete_list 變量,咱們可使用下面的代碼來顯示這個列表:code

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

給標籤增長一個 reversed 使得該列表被反向迭代:

{% for athlete in athlete_list reversed %}
...
{% endfor %}

能夠嵌套使用 {% for %} 標籤:

{% for athlete in athlete_list %}
    <h1>{{ athlete.name }}</h1>
    <ul>
    {% for sport in athlete.sports_played %}
        <li>{{ sport }}</li>
    {% endfor %}
    </ul>
{% endfor %}

2.3 ifequal/ifnotequal 標籤

{% ifequal %} 標籤比較兩個值,當他們相等時,顯示在 {% ifequal %} 和 {% endifequal %} 之中全部的值。htm

下面的例子比較兩個模板變量 user 和 currentuser :

{% ifequal user currentuser %}
    <h1>Welcome!</h1>
{% endifequal %}

和 {% if %} 相似, {% ifequal %} 支持可選的 {% else%} 標籤:8

{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% else %}
    <h1>No News Here</h1>
{% endifequal %}

2.4 註釋標籤

Django 註釋使用 {# #}。

{# 這是一個註釋 #}

2.5 過濾器

模板過濾器能夠在變量被顯示前修改它,過濾器使用管道字符,以下所示:

{{ name|lower }}

{{ name }} 變量被過濾器 lower 處理後,文檔大寫轉換文本爲小寫。

過濾管道能夠被* 套接* ,既是說,一個過濾器管道的輸出又能夠做爲下一個管道的輸入:

{{ my_list|first|upper }}

以上實例將第一個元素並將其轉化爲大寫。

有些過濾器有參數。 過濾器的參數跟隨冒號以後而且老是以雙引號包含。

例如:

{{ bio|truncatewords:"30" }}

這個將顯示變量 bio 的前30個詞。

2.6 其餘過濾器:

  • addslashes : 添加反斜槓到任何反斜槓、單引號或者雙引號前面。
  • date : 按指定的格式字符串參數格式化 date 或者 datetime 對象,實例:
{{ pub_date|date:"F j, Y" }}
  • length : 返回變量的長度。

2.7 include 標籤

{% include %} 標籤容許在模板中包含其它的模板的內容。 下面這個例子都包含了 nav.html 模板:

{% include "nav.html" %}

3、模板繼承

3.1 模板能夠用繼承的方式來實現複用。

接下來咱們先建立以前項目的 templates 目錄中添加 base.html 文件,代碼以下: HelloWorld/templates/base.html 文件代碼:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
    
    <p>菜鳥教程 Django 測試。</p>
    {% block mainbody %}
       <p>original</p>
    {% endblock %}
</body>
</html>

以上代碼中,名爲 mainbody 的 block 標籤是能夠被繼承者們替換掉的部分。 全部的 {% block %} 標籤告訴模板引擎,子模板能夠重載這些部分。

hello.html 中繼承 base.html,並替換特定 block,hello.html 修改後的代碼以下:

HelloWorld/templates/hello.html 文件代碼:

{%extends "base.html" %}
 
{% block mainbody %}
<p>繼承了 base.html 文件</p>
<p>{{hello}}</p>
{% endblock %}

第一行代碼說明 hello.html 繼承了 base.html 文件。能夠看到,這裏相同名字的 block 標籤用以替換 base.html 的相應 block。

從新訪問地址 http://127.0.0.1:8000/hello,輸出結果以下:

菜鳥教程 Django 測試。

繼承了 base.html 文件

Hello World!
相關文章
相關標籤/搜索