Django--templates(模板層)


模板語法:

   """
    模板語法:
        變量:{{}}
            1.深度查詢    句點符
            2.過濾器   {{value|filter_name:參數}}

        標簽:{% %}

    """
模板語法
1.渲染變量{{ }}
1.深度查詢 句點符
      語法:{{var_name}}
      <p>{{ alex.age }}</p>
<p>{{ person_list.1.age }}</p>
2.過濾器
      語法:{{obj|filter__name:param}}
      按照某種形式渲染出來
<p>{{ now|date:'Y-m-d' }}</p>
<p>{{ info.name|upper }}</p>

2.渲染標簽{% %}
      語法:{% tag %}
 

單個參數傳遞:

 return render(request, 'index.html', {'name': name})

傳遞所有參數:

views.py

locals() 傳遞所有變量

def index(request):
"""
模版語法:
變量:{{}}
1、深度查詢 句點符
2、過濾器

標簽:{% %}

"""
name='yuan'
i=10
l=[11,22,33]
info={'name':'alex','age':23}
b=True
class Person(object):
def __init__(self,name,age):
self.name=name
self.age=age
peo1=Person('alex',33)
peo2=Person('egon',23)
person_list=[peo1,peo2]

return render(request,'index.html',locals())
# html文件,模版文件

index.html:

<body>
    <div>
        <p>python revenge</p>
        <p>{{ name }}</p>
        <p>{{ i }}</p>
        <p>{{ l }}</p>
        <p>{{ b }}</p>
        <p>{{ peo1 }}</p>
        <p>{{ peo2 }}</p>
        <p>深度查詢</p>
        <p>{{ l.1 }}</p>
        <p>{{ info.name }}</p>
        <p>{{ info.age }}</p>
        <p>{{ person_list.1.name}}</p>
    </div>
</body>

運行結果:

模板之過濾器

語法:

{{obj|filter__name:param}}
default

如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如:

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

{{ value|length }}
如果 value 是 ['a', 'b', 'c', 'd'],那么輸出是 4。
date
如果 value=datetime.datetime.now()

{{ value|date:"Y-m-d" }}
slice
如果 value="hello world"

{{ value|slice:"2:-1" }}
truncatechars
如果字符串字符多於指定的字符數量,那么會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾。
參數:要截斷的字符數
例如:

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

filesizeformat

 
         

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

 
         

{{ value|filesizeformat }}

模板之標簽

 標簽看起來像是這樣的: {% tag %}。標簽比變量更加復雜:一些在輸出中創建文本,一些通過循環或邏輯來控制流程,一些加載其后的變量將使用到的額外信息到模版中。

一些標簽需要開始和結束標簽 (例如{% tag %} ...標簽 內容 ... {% endtag %})。

 

for標簽
遍歷每一個元素:

可以利用{% for obj in list reversed %}反向完成循環。
遍歷一個字典:

{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}
注:循環序號可以通過{{forloop}}顯示 
for ... empty
for 標簽帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,可以有所操作。

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 %}
 
         

csrf_token
這個標簽用於跨站請求偽造保護

---

<h3>for標簽</h3>
        {% for i in l %}
        <p>{{ i }}</p>
        {% endfor %}

        {% for index in info %}
        <p>{{ index}}</p>
        {% endfor %}
        {% for i in person_list2 %}
        <p>{{ forloop.counter }} {{ i.name }},{{ i.age }}</p>
        {% endfor %}

        {% for i in person_list %}
        <p>{{ forloop.counter }} {{ i.name }},{{ i.age }}</p>
{#            列表為空就執行#}
        {% empty %}
            <p>列表為空</p>
        {% endfor %}
        <hr>
        <h3>if標簽</h3>
        {% if user %}
        <p>
            <a href="">hi {{ user }}</a>
            <a href="">注銷</a>
        </p>
        {% else %}
        <p>
            <a href="">登錄</a>
            <a href="">注冊</a>
        </p>
        {% endif %}
        <hr>
        {% with person_list2.1.name as n %}
        {{ n }}
        {% endwith %}
        <hr>

 

 csrf_token
這個標簽用於跨站請求偽造保護

 為了保留django 留給我們得 安全機制 django 得中間見
 只要發 post 請求 ,{ % csrf_token %}  為了安全機制
 { % csrf_token %} 解決辦法
 < input
 type = 'hidden'
 name = 'csrfmiddlewaretoken'
 value = 'OqNwoXIbFSTI3qxdtqKppQuZvlWebFgw9vSAkGXrGX4J2wo9t7OWDXvyxU4asBRE' / >

----------------------------------------------------------------------------------

 

 

模板 - 自定義標簽和過濾器--解決復用問題

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

 

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

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

過濾器
from
django import template register=template.Library() @register.filter def multi_file(x,y): return x*y
---------------------------------
<h4>自定義過濾器</h4>
{% load my_tag_file %}
<p> {{ i|multi_file:20 }}</p>
<h4>自定義標簽</h4>
{% multi_tags 7 9 1 %}

 

過濾器最多只能定義兩個形參

標簽,沒有參數限制
@register.simple_tag
def multi_tags(x,y,z):
    return x*y*z
---------------------------
 <h4>自定義標簽</h4>
{% multi_tags 7 9 1 %}

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

 {% load my_tags %}

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

  -------------------------------.html
  {% load xxx %}        
  # num=12
  {{ num|filter_multi:2 }} #24
  {{ num|filter_multi:"[22,333,4444]" }}
  {% simple_tag_multi 2 5 %}  參數不限,但不能放在if for語句中
  {% simple_tag_multi num 5 %}

注意:filter可以用在if等語句后,simple_tag不可以

{% if i|multi_file:10 > 100 %}
<p>100</p>
{% else %}
<p>{{ i }}</p>
{% endif %}

模板繼承 (extend)

Django模版引擎中最強大也是最復雜的部分就是模版繼承了。模版繼承可以讓您創建一個基本的“骨架”模版,它包含您站點中的全部元素,並且可以定義能夠被子模版覆蓋的 blocks 。
通過從下面這個例子開始,可以容易的理解模版繼承:

 

把廣告ads.html的內容引入,全部引入

extend是在基礎base.html中部分內容,其他文件index.html先繼承基礎文件,在進行擴寫

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <style type="text/css">
        *{margin: 0;padding: 0;}
        {#div{width: 300px;height: 1000px;background-color: green}#}
        .header{width: 100%;height: 50px;
        background-color: #369}

    </style>
</head>
<body>
<div class="header"></div>
<div class="container">
    <div class="row">
        <div class="col-md-3">
           {% include 'ads.html' %}
        </div>
        <div class="col-md-9">
           {% block con %}
            {% endblock %}

        </div>
    </div>
</div>


</body>
</html>
base.html

 base.html可以預留很多盒子給繼承的文件擴展

{% extends 'base.html' %}
在繼承的文件里面必須首行放

模板復用就用extend

案例分析

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{%/span> endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>

這個模版,我們把它叫作 base.html, 它定義了一個可以用於兩列排版頁面的簡單HTML骨架。“子模版”的工作是用它們的內容填充空的blocks。
在這個例子中, block 標簽定義了三個可以被子模版內容填充的block。 block 告訴模版引擎: 子模版可能會覆蓋掉模版中的這些位置。
子模版可能看起來是這樣的:

第一種情況:

第二種情況:會覆蓋父模板的內容

第三種情況:父模板有內容,繼承時不覆蓋

 

請注意,子模版並沒有定義 sidebar block,所以系統使用了父模版中的值。父模版的 {% block %} 標簽中的內容總是被用作備選內容(fallback)。 這種方式使代碼得到最大程度的復用,並且使得添加內容到共享的內容區域更加簡單,例如,部分范圍內的導航。 這里是使用繼承的一些提示: 如果你在模版中使用 {% extends %} 標簽,它必須是模版中的第一個標簽。其他的任何情況下,模版繼承都將無法工作。 在base模版中設置越多的 {% block %} 標簽越好。請記住,子模版不必定義全部父模版中的blocks,所以,你可以在大多數blocks中填充合理的默認內容,然后,只定義你需要的那一個。多一點鈎子總比少一點好。
如果你發現你自己在大量的模版中復制內容,那可能意味着你應該把內容移動到父模版中的一個 {
% block %} 中。
If you need to get the content of the block
from the parent template, the variable will do the trick.

This is useful if you want to add to the contents of a parent block instead of completely overriding it.
Data inserted using will not be automatically escaped (see the next section), since it was already escaped, if necessary, in the parent template. 為了更好的可讀性,你也可以給你的{% endblock %} 標簽一個 名字 。例如: {% block content %} ... {% endblock content %} 在大型模版中,這個方法幫你清楚的看到哪一個  {% block %} 標簽被關閉了。 不能在一個模版中定義多個相同名字的 block 標簽。  

 


免責聲明!

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



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