Django内置template标签

html过滤{% autoescape on|off %} {{body}} {% endautoescape %}

注释{% comment %} {% endcomment %}

csrf攻击 {% csrf_token %}

循环选择 {% cycle %}    <tr class='{% cycle 'row1' 'row2' %}>

使用当前循环选择

<tr>
    <td class="{% cycle 'row1' 'row2' as rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>
<tr>
    <td class="{% cycle rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>

 注意到变量的值是没有自动转义的,所以要加上显式转义:

{% for o in some_list %}
    <tr class="{% filter force_escape %}{% cycle rowvalue1 rowvalue2 %}{% endfilter %}">
        ...
    </tr>
{% endfor %}

 如果你只是想声明这个循环,而不是输出循环的值,那么在标签的最后增加关键字silent。例:

{% for obj in some_list %}
    {% cycle 'row1' 'row2' as rowcolors silent %}
    <tr class="{{ rowcolors }}">{% include "subtemplate.html " %}</tr>
{% endfor %}

 一旦你在cycle定义中使用了关键字silent,随后的cycle标签也会自动使用silent。下面的例子什么也不会输出,即使第二次cycle没有指定silent

{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}

 


 

new in Django1.6

{% load cycle from future %}

此时可以使用autoescape off

{% for o in some_list %}
    <tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
        ...
    </tr>
{% endfor %}

 


输出地一个不是false的变量

{% firstof var1 var2 var3 %}

等价于

{% if var1 %}
    {{ var1|safe }}
{% elif var2 %}
    {{ var2|safe }}
{% elif var3 %}
    {{ var3|safe }}
{% endif %}

 可以加个默认值

{% firstof var1 var2 var3 "fallback value" %}


 

{% include "name_snippet.html" with person="Jane" greeting="Hello" %}

加入新页面,传入新变量.


重新分组

假设传入的参数如下:

 

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]

 我们想按照国家来划分展示:

  • India
    • Mumbai: 19,000,000
    • Calcutta: 15,000,000
  • USA
    • New York: 20,000,000
    • Chicago: 7,000,000
  • Japan
    • Tokyo: 33,000,000  

我们可以使用{% regroup %}

{% regroup cities by country as country_list %}

<ul>
{% for country in country_list %}
    <li>{{ country.grouper }}
    <ul>
        {% for item in country.list %}
          <li>{{ item.name }}: {{ item.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

 但是相同country必须挨在一起排列

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]

 否则会输出如下:

  • India
    • Mumbai: 19,000,000
  • USA
    • New York: 20,000,000
  • India
    • Calcutta: 15,000,000
  • USA
    • Chicago: 7,000,000
  • Japan
    • Tokyo: 33,000,000

解决办法可以使用

{% regroup cities|dictsort:"country" by country as country_list %}

并且我们也可以使用country的属性进行分类,例如country有一个外键description

{% regroup cities by country.description as country_list %}

假如country是一个选择值,我么可以使用get_country_display来显示它的string而不是key值


 

{% spceless %}去掉多余的空格

 

{% spaceless %}
    <p>
        <a href="foo/">Foo</a>
    </p>
{% endspaceless %}

 

 效果如下:

<p><a href="foo/">Foo</a></p>

但是只有紧挨着的标签内的空格才会去除,内部的标签空格不会去掉.

{% spaceless %}
    <strong>
        Hello
    </strong>
{% endspaceless %}

 <strong>里的空格就不会去掉.

 


 

url传参

{% url 'path.to.some_view' v1 v2 %}
{% url 'path.to.some_view' arg1=v1 arg2=v2 %}

 我们可以在url中使用as参数

{% url 'path.to.view' arg arg2 as the_url %}

就可以在页面其他地方使用

<a href="{{ the_url }}">I'm linking to {{ the_url }}</a>


 

{% verbatim %} {% endverbatim %}禁止template render该内容.


 

重命名变量内容,减少输入

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

 也可以

{% with alpha=1 beta=2 %}
    ...
{% endwith %}

 


 

排序

{{ value|dictsort:"name" }}

假如value是

[
    {'name': 'zed', 'age': 19},
    {'name': 'amy', 'age': 22},
    {'name': 'joe', 'age': 31},
]

 排序后的输出为

[
    {'name': 'amy', 'age': 22},
    {'name': 'joe', 'age': 31},
    {'name': 'zed', 'age': 19},
]

 

{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}

 


 

可整除

{{ value|divisibleby:"3" }}


 

过去了多长时间

{{ blog_date|timesince:comment_date }} 评论的时间距博客发表时间过了多久.

还多长时间

{{ conference_date|timeuntil:from_date }} from_data距conference_data还多长时间.


截取字符

{{ value|truncatechars:9 }}  例如value是"Joel is a slug"输出会是"Joel i..."

{{ value|truncatechars_html:9 }} 假如value是"<p>Joel is a slug<p>"输出会是<p>Joel i...</p>

{{ value|truncatewords:2 }} 假如value是"Joel is a slug"输出会是"Joel is..."

{{ value|truncatewords_html:2 }} 假如value是"<p>Joel is a slug<p>"输出会是<p>Joel is...</p>


{{ value|urlencode:"" }} If value is "http://www.example.org/", the output will be "http%3A%2F%2Fwww.example.org%2F".


 

{{ value|yesno:"yeah,no,maybe" }}


 

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>

 等价于

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />

 

posted on 2015-01-22 21:59  颓废的悠然  阅读(389)  评论(0编辑  收藏  举报

导航