前言:django的模板語法基本和flask的jinja2基本一樣。下面比較一下兩個模板語法的區別。
------深度變量的查找(萬能的句點號)
在 Django 模板中遍歷復雜數據結構的關鍵是句點字符 (.)。
1.模板變量
django:{{? 變量? }}??? # 因為django只有一個context返回,全部數據都集中在一起
jinja2:{{? 對象.變量? }}
2.根據列表的下標獲取值
django:{{? 列表.0? }}
jinja2:{{? 列表[0]? }}
3.根據字典的鍵獲取字典的值
django:{{? 字典.key? }}
jinja2:{{? 字典[key]? }}或者{{? 字典.key? }}
4.for循環時取序號
django:
{% for item in 列表 %}{{forloop.counter}} <1-- 表示當前是第幾次循環,從1開始 -->{{forloop.counter0}} <!-- 表示當前是第幾次循環,從0開始 -->{% endfor %}
jinja2:
{% for item in 列表 %}{{loop.index}} <1-- 表示當前是第幾次循環,從1開始 -->{{loop.index0}} <!-- 表示當前是第幾次循環,從0開始 -->{% endfor %}
# for遍歷字典
{{ for key,val in dic.items}}
{{k}} : {{v}}
{{ endfor }}
<ul>
{% for obj in list %}<li>{{ obj.name }}</li> {% endfor %} </ul>#在標簽里添加reversed來反序循環列表: {% for obj in list reversed %}...{% endfor %}#{% for %}標簽可以嵌套: {% for country in countries %}<h1>{{ country.name }}</h1><ul>{% for city in country.city_list %}<li>{{ city }}</li>{% endfor %}</ul>{% endfor %}#系統不支持中斷循環,系統也不支持continue語句,{% for %}標簽內置了一個forloop模板變量, #這個變量含有一些屬性可以提供給你一些關于循環的信息1,forloop.counter表示循環的次數,它從1開始計數,第一次循環設為1:{% for item in todo_list %}<p>{{ forloop.counter }}: {{ item }}</p>{% endfor %} 2,forloop.counter0 類似于forloop.counter,但它是從0開始計數,第一次循環設為0 3,forloop.revcounter 4,forloop.revcounter0 5,forloop.first當第一次循環時值為True,在特別情況下很有用:{% for object in objects %} {% if forloop.first %}<li class="first">{% else %}<li>{% endif %} {{ object }} </li> {% endfor %} # 富有魔力的forloop變量只能在循環中得到,當模板解析器到達{% endfor %}時forloop就消失了 # 如果你的模板context已經包含一個叫forloop的變量,Django會用{% for %}標簽替代它 # Django會在for標簽的塊中覆蓋你定義的forloop變量的值 # 在其他非循環的地方,你的forloop變量仍然可用#{% empty %} {{li }}{% for i in li %}<li>{{ forloop.counter0 }}----{{ i }}</li>{% empty %}<li>this is empty!</li>{% endfor %}# [11, 22, 33, 44, 55] # 0----11 # 1----22 # 2----33 # 3----44 # 4----55
5.列表為空時執行邏輯
django:
{% for item in 列表 %}{{forloop.counter}} {{ item }} <1-- 表示當前是第幾次循環,從1開始 -->{{forloop.counter0}} {{ item }}
<!-- 表示當前是第幾次循環,從0開始 --> {% empty %} 列表為空或不存在時執行此邏輯 {% endfor %}
jinja2:無
6.if語句
{% if num >= 100 and 8 %}{% if num > 200 %}<p>num大于200</p> {% else %} <p>num大于100小于200</p> {% endif %} {% elif num < 100 %} <p>num小于100</p> {% else %} <p>num等于100</p> {% endif %} {% if %} 標簽接受and,or或者not來測試多個變量值或者否定一個給定的變量 {% if %} 標簽不允許同一標簽里同時出現and和or,否則邏輯容易產生歧義,例如下面的標簽是不合法的: {% if obj1 and obj2 or obj3 %}
?
7.過濾器
django:
變量|過濾器:參數
jinja2:變量 | 過濾器(參數)??? 常見的jinja2過濾器:https://www.cnblogs.com/chichung/p/9775099.html
django的常見幾個過濾器如下:
- safe,禁用html轉義(顯示html標簽樣式,而不是字符串)
- length,長度,返回字符串包含字符的個數,或列表、元組、字典的元素個數。
default,默認值,如果變量不存在時則返回默認值。
data|default:'默認值'
date,日期,用于對日期類型的值進行字符串格式化,常用的格式化字符如下:
- Y表示年,格式為4位,y表示兩位的年。
- m表示月,格式為01,02,12等。
- d表示日, 格式為01,02等。
- j表示日,格式為1,2等。
- H表示時,24進制,h表示12進制的時。
- i表示分,為0-59。
- s表示秒,為0-59。
value|date:"Y年m月j日 H時i分s秒"
1 add : 給變量加上相應的值## 2 addslashes : 給變量中的引號前加上斜線## 3 capfirst : 首字母大寫 # # 4 cut : 從字符串中移除指定的字符 # # 5 date : 格式化日期字符串 # # 6 default : 如果值是False,就替換成設置的默認值,否則就是用本來的值 # # 7 default_if_none: 如果值是None,就替換成設置的默認值,否則就使用本來的值 #實例: #value1="aBcDe" {{ value1|upper }}<br> #value2=5 {{ value2|add:3 }}<br> #value3='he llo wo r ld' {{ value3|cut:' ' }}<br> #import datetime #value4=datetime.datetime.now() {{ value4|date:'Y-m-d' }}<br> #value5=[] {{ value5|default:'空的' }}<br> #value6='<a href="#">跳轉</a>' {{ value6 }} {% autoescape off %} {{ value6 }} {% endautoescape %} {{ value6|safe }}<br> {{ value6|striptags }} #value7='1234' {{ value7|filesizeformat }}<br> {{ value7|first }}<br> {{ value7|length }}<br> {{ value7|slice:":-1" }}<br> #value8='http://www.baidu.com/?a=1&b=3' {{ value8|urlencode }}<br> value9='hello I am yuan'
8.多行注釋
django:
{% comment %} ... {% endcomment %}
9.對有需要的block進行重寫
django:
- 不用重寫父模版中的所有block,如果子模版沒有重寫,則使用父模版定義的默認值。
-
可以使用?
block.super
?來包含父模板的塊中定義的內容,如下
{% block 名稱 %} 子模板的內容 {{ block.super }} 顯示父模板中block的內容 {% endblock %}
{{ block.super }}——引用上級代碼塊在其基礎上進行一些修改
flask:
同樣原理,不過用的是{{? super()? }}
?
10.csrf_token
? ? ?用于生成csrf_token的標簽,用于防治跨站攻擊驗證。注意如果你在view的index里用的是render_to_response方法,不會生效
???? 其實,這里是會生成一個input標簽,和其他表單標簽一起提交給后臺的。
{% csrf_token %} 放到form中
?
11.引用路由配置地址 {% url %}
1.
urlpatterns = [url(r'^register.html$', register, name="register"), ]2.
<form action="{% url "register" %}" ><input type="text"><input type="submit"value="提交">{%csrf_token%} </form>
?
12.用更簡單的變量名替代復雜的變量名 {% with %}
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
?
13.{% load %}:?加載標簽庫
{% load staticfiles %}<script src="{% static 'plugins/jquery.min.js' %}"></script>
?
14.自定義tag標簽
------a、在app中創建templatetags模塊(必須的)------b、創建任意 .py 文件,如:my_tags.pyfrom django import template from django.utils.safestring import mark_saferegister = template.Library() #register的名字是固定的,不可改變 @register.filter def filter_multi(v1,v2):return v1 * v2@register.simple_tag def simple_tag_multi(v1,v2):return v1 * v2@register.simple_tag def my_input(id,arg):result = "<input type='text' id='%s' class='%s' />" %(id,arg,)return mark_safe(result)------c、在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py :{% load my_tags %}------d、使用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 %}------e、在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag.注意:filter可以用在if等語句后,simple_tag不可以{% if num|filter_multi:30 > 100 %}{{ num|filter_multi:30 }} {% endif %}
?
?
?
CP https://www.cnblogs.com/chichung/p/9898017.html