Django模板層(template)


1、模板是一個文本,用於分離文檔的表現形式和內容。也可以說是:HTML代碼+模板語法

     簡單的例子:使用模板在頁面顯示“hello word”     

      在template中新建html文件:hello.html,  在views.py中添加對象,向模板中提交數據。在urls.py中添加url與函數對象的映射關系

<h1>{{ hello }}</h1>
hello.html
from django.shortcuts import render,redirect,HttpResponse

def hello(request):
    context={}
    context['hello'] = 'Hello World!'
    return render(request, 'hello.html', context)
views.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello/', views.index),

]
urls.py

     訪問:http://127.0.0.1:8000/hello 的到如下結果

       

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

 

2、模板語法之變量:

     在模板中變量的語法:用雙大括號  {{ var_name }}

     例:在views.py的變量形式     

def index(request):
    import datetime
    s="hello"
    l=[111,222,333]    # 列表
    dic={"name":"yuan","age":18}  # 字典
    date = datetime.date(1993, 5, 2)   # 日期對象
 
    class Person(object):
        def __init__(self,name):
            self.name=name
 
    person_yuan=Person("yuan")  # 自定義類對象
    person_egon=Person("egon")
    person_alex=Person("alex")
 
    person_list=[person_yuan,person_egon,person_alex]
 
 
    return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list}) 

  在template中的變量形式:

<h4>{{s}}</h4>
<h4>列表:{{ l.0 }}</h4>
<h4>列表:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>
<h4>類對象列表:{{ person_list.0.name }}</h4>

3、模板之過濾器

     語法:{{obj|filter__name:param}}

     default:如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如:{{ value|default:"nothing" }}

     length:返回值的長度。它對字符串和列表都起作用。例如:{{ value|length }}

     filesizeformat:將值格式化為一個 “人類可讀的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)。例如:{{ value|filesizeformat }}

     date:將值按照給定的方式格式化。{{ value|date:"Y-m-d" }} 

     safe:Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內                容管理系統,后台添加的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加注了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的                源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。比如:

        value="<a href="">點擊</a>"

              {{ value|safe}}

4、模板之標簽:

     for標簽:遍歷每一個元素,  語法:                   

{% for person in person_list %}
    <p>{{ person.name }}</p>
{% endfor %}

  for...empty標簽:for 標簽帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,可以有所操作。

{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}

  if標簽:{% if %}會對一個變量求值,如果它的值是“True”(存在、不為空、且不是boolean類型的false值),對應的內容塊會輸出。

{% if num > 100 or num < 0 %}
    <p>無效</p>
{% elif num > 80 and num < 100 %}
    <p>優秀</p>
{% else %}
    <p>湊活吧</p>
{% endif %}

  with標簽:使用一個簡單地名字緩存一個復雜的變量,當你需要使用一個“昂貴的”方法(比如訪問數據庫)很多次的時候是非常有用的

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

5、自定義標簽和過濾器:     

     1>  在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag.

     2>  在app中創建templatetags模塊(模塊名只能是templatetags)

     3>  創建任意 .py 文件,如:my_tags.py           

from django import template
from django.utils.safestring import mark_safe
 
register = template.Library()   #register的名字是固定的,不可改變
#以上內容是固定格式。

@register.filter     #定義一個過濾器       
def filter_multi(x,y): #實現一個簡單的乘法函數 
return x * y

@register.simple_tag #定義一個標簽
def multi(x,y):  
return x * y

  

     4>  在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py

           {% load my_tags %}

     5>  使用simple_tag和filter(如何調用)

            num=10

           {{ num|filter_multi:2 }}      #經過調用得:20

     注意:filter可以用在if等語句后,simple_tag不可以。filter只能接收兩個參數。

6、模板繼承:

      Django模版引擎中最強大也是最復雜的部分就是模版繼承,模板繼承簡單理解為通過繼承的方法實現模板(base.html)復用。

      簡單的例子:以下文件base.html為模板文件,文件中 {% block mainbody %}   {% endblock %} 內需要補充自己需要的內容,子模版可能會覆蓋掉模版中的這些位置。  

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
 6 </head>
 7 <body>
 8     <h1>Hello World!</h1>
 9     {% block mainbody %}
10 
11     {% endblock %}
12 </body>
13 </html>

       下面的文件為繼承base.html 

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

 輸出結果:

   

 

    

 

     

     

     

         


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM