Django模板

模板查找路径配置

settings.py文件中。TEMPLATES配置包含模板引擎配置,模板查找路径配置,模板上下文配置。

模板路径配置

  1. DIRS:可以存放所有的模板路径,使用renderrender_to_string渲染模板时会从此列表路径中查找模板
  2. APP_DIRS:默认为True,设置为True后,会在INSTALLED_APPS已安装APP下的templates目录下查找模板
  3. 查找顺序:如render('index.html'),先从DIRS列表中依次查找路径下是否存在此模板,有就返回。没有再从所有已安装的APP下的templates目录中查找模板(优先从当前使用render渲染模板的视图所属的APP中查找),如果所有路径下都没找到,则抛出TemplateDoesNotExist异常。

DTL模板语法

变量

Django渲染模板时,可以传递变量对应值进行替换。变量的命名:由数字,英文字符以及下划线组成,不能出现标点符号等特殊字符。变量需要通过视图函数渲染,视图函数在使用renderrender_to_string时可以传递一个context参数(字典类型),模板会从context中读值。

【例】

# profile.html
<p>{{ username }}</p>

# views.py代码
def profile(request):
return render(request, 'profile.html', context={'username': 'yutou'})

模板中的变量支持点(.)的形式。

person.username

  1. 如果person是字典,会查找字典中username这个key对应的值
  2. person是对象,会查找对象的username属性或方法

person.1

先判断person是否是一个列表或者元组或者任意可以通过下标访问的对象,如果是则取第1个值,否则取到空字符串。

不能通过中括号形式访问字典和列表中的值,不支持dict[‘key’]和list[1]

使用点(.)语法获取对象值时,可以获取对象属性,在给字典添加key时,不能和字典的属性或方法重复。比如items,items是字典的方法,如果给字典添加了items作为key,就无法通过items来访问字典的键值对。

常用模板标签

所有标签都需要用标签符号{%%}进行包裹

ifif标签相当于Python中的if语句,有elifelse相对应。if标签中可以使用==, !=, <, >, <=, >=, in, not in, is, is not等判断运算符

{% if "hello" in words %}
<p>hello world</p>
{% else %}
<p>goodbey</p>
{% endif %}

for…in…:遍历列表,元组,字符串,字典等可迭代对象。没有continuebreak语法

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

// 反向遍历
{% for person in persons reversed %}
<p>{{ person.name }}}</p>
{% endfor %}

遍历字典时,需要使用itemskeysvalues等方法

{% for key, value in person.items %}
<p>key: {{ key }}</p>
<p>value: {{ value }}</p>
{% endfor %}

for循环中,DTL提供了一些变量可供使用。

变量 作用
forloop.counter0 当前循环下标,以0开始
forloop.counter 当前循环下标,以1开始
forloop.revcounter 当前循环的反向下标值,以1作为最后一个元素的下标
forloop.revcounter0 当前循环的反向下标值,以0作为最后一个元素的下标
forloop.first 是否是第一次遍历
forloop.last 是否是最后一次遍历
forloop.parentloop 如果有多个循环嵌套,代表上一级的for循环

for…in…empty:如果遍历对象没有元素时,会执行empty中的内容

{% for person in persons %}
<li>{{ person }}</li>
{% empty %}
<p>persons is none</p>
{% endfor %}

with:在模板中定义变量。有时一个变量访问时比较复杂,可以先把复杂的变量缓存到一个变量A上,以后使用变量A就可以了。

context = {
"persons": ["Abei", "Bob"],
}

{% with abei=person.0 %}
<p>{{ abei }}</p>
{% endwith %}

注意

  • with中定义的变量,只能在with中使用,不能在with标签外使用

  • 定义变量时,不能在等号左右两边留有空格

  • as```语法

    ```html
    {% with person.1 as bob %}
    <p>{{ bob }}</p>
    {% endwith %}

url:在模板中,如果通过硬编码的方式直接将url写死对于以后项目维护会造成困难。可以通过类似django中的reverse反转的方式来实现。

<a href="{% url 'book:list' %}">图书列表页</a>

如果url反转时需要传参,可以在后面传递。但位置参数与关键字参数不能同时使用

# path部分
path('detail/<book_id>/', views.book_detail, name='detail')

# url反转,使用位置参数
<a href="{% url 'book:detail' 1 %}">图书详情页</a>

# url反转,使用关键字参数
<a href="{% url 'book:detail' book_id=1 %}">图书详情页</a>

如果需要传递查询字符串参数,必须手动在后面添加

<a href="{% url 'book:detail' book_id=1 %}?page=1">图书详情页</a>

如果需要传递多个参数。 通过空格的方式进行分隔

<a href="{% url 'book:detail' book_id=1 page=2 %}">图书详情页</a>

spaceless:移除html的空白字符。包括空格,tab,换行等

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

渲染完成后,变成以下代码

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

spaceless只会移除html标签之间的空白字符。而不会移除标签与文本之间的空白字符

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

不会移除strong中的空白字符

autoespace:开启和关闭此标签内元素的自动转义功能。自动转义是将一些特殊字符,如<转义成html语法能识别的字符,<会被转义成&lt;>会被自动转义成&gt;。模板中默认已开启自动转义。

# 传递的上下文信息
context = {
"info": "<a href='www.baidu.com'>百度</a>"
}

# 模板
{{ info }}

# 最终渲染
&lt;a href=&#39;www.baidu.com&$39;&gt;百度&lt;/a&gt;

关闭自动转义

{% autoescape off %}
{{ info }}
{% endescape %}

# 最终渲染,超链接百度
百度

verbatim:默认DTL模板会解析特殊字符({{}}, {%%})。此标签中的代码块的特殊字符不会被DTL解析

{% verbatim %}
{{if hello}}Hello World!{{/if}}
{% endverbatim %}