1.常用语法
只需要记两种特殊符号:
{{ }}和 {% %}
变量相关的用{{}},逻辑相关的用{%%}。
在Django的模板语言中按此语法使用:{{ 变量名 }}。
当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。 变量的命名包括任何字母数字以及下划线 ("_")的组合。 变量名称中不能有空格或标点符号。
点(.)在模板语言中有特殊的含义。当模版系统遇到点("."),它将以这样的顺序查询:
字典查询(Dictionary lookup)
属性或方法查询(Attribute or method lookup)
数字索引查询(Numeric index lookup)
注意事项:
- 如果计算结果的值是可调用的,它将被无参数的调用。 调用的结果将成为模版的值。
- 如果使用的变量不存在, 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为'' (空字符串) 。
几个例子:
在Django中一个app中的views的代码如下:
from django.shortcuts import render, redirect, HttpResponse
# Create your views here.
def test_filter(request):
# 定义一个str类型的测试类型
a_str = '测试数据'
# 定义一个list类型的测试类型
a_list = ['test1', 'test2', 'test3']
# 定义一个字典类型的测试类型
a_dict = {'test_1': 1, 'test_2': 2, 'test_3': 3}
# 定义一个Boolean类型的测试类型
a_true = False
# 返回到html数据
return render(request, 'test_django/test.html', {'a_str': a_str, 'a_list': a_list, 'a_dict': a_dict, 'a_true': a_true})
现在就看看template中的编写了:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>my_test</title>
</head>
<body>
<p>传递一个字符串类型:{{ a_str }}</p>
<hr>
<p>传递一个列表过来了:{{ a_list }}</p>
<hr>
<p>取出a_list中第二值:{{ a_list.1 }}</p>
<hr>
<p>传递一个字典过来了:{{ a_dict }}</p>
<hr>
<p>取出a_dict中key为test_2的值:{{ a_dict.test_2 }}</p>
<hr>
<p>当传递的值为False或者True或None是传递一个默认的值:{{ a_true|default:'这是空的值' }}</p>
<hr>
<h1>这是for的使用</h1>
<ul>
{% for i in a_list %}
<li> {{ i }}</li>
{% endfor %}<hr>
</body>
</html>
运行效果如图。这里就不讲Django代码的url的处理方面的了:
这里说到了一个for的使用,当你传递的是一个可迭代对象要单独一个个显示时即可使用for进行了:
这里的for需要使用
{% for i in list %}开始
{{ i }}这里写迭代出来的对象
{% endfor %}结束
除了for 还有if 之类的语句这里也暂不详解了
上面说了如何使用一些基本的模板语法,下面在讲一下filter(过滤器)
在Django的模板语言中,通过使用 过滤器 来改变变量的显示。
过滤器的语法: {{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器。
例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。
注意事项:
- 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
- 过滤器可以接受参数,例如:{{ var|truncatewords:30 }},这将显示var的前30个词。
- 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
- '|'左右没有空格没有空格没有空格
Django的模板语言中提供了大约六十个内置过滤器。(这里也不详解先。)
除了内置的过滤器,Django还支持自定义自己需要的filter
还是刚刚那个app的目录下,在目录下创建一个templatetags(名字只能是这一个。) 的python文件夹,在文件里面创建一个my_filter.py文件在里面编写:
# -*- coding: utf-8 -*-
# @Time : 2018/11/2 14:37
# @Author : lh
# @Email :
# @File : my_filter.py
# @Software: PyCharm
from django import template
register = template.Library()
@register.filter(name='oh')
def oh_shit(arg):
return '{} 这是自定义的filter'.format(arg)
@register.filter(name='oh_no')
def oh_shits(arg, arg2):
return '{}-----{}'.format(arg, arg2)
然后还是视图层显示了:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>my_test</title>
</head>
<body>
<p>传递一个字符串类型:{{ a_str }}</p>
<hr>
<p>传递一个列表过来了:{{ a_list }}</p>
<hr>
<p>取出a_list中第二值:{{ a_list.1 }}</p>
<hr>
<p>传递一个字典过来了:{{ a_dict }}</p>
<hr>
<p>取出a_dict中key为test_2的值:{{ a_dict.test_2 }}</p>
<hr>
<p>当传递的值为False或者True或None是传递一个默认的值:{{ a_true|default:'这是空的值' }}</p>
<hr>
<h1>这是for的使用</h1>
<ul>
{% for i in a_list %}
<li> {{ i }}</li>
{% endfor %}
<hr>
<h1>这是for下面自定义filter的使用基础版</h1>
<ul>
{% load myfilter %}
{% for i in a_list %}
<li> {{ i|oh }}</li>
{% endfor %}
</ul>
<hr>
<h1>这是for下面自定义filter的使用进阶版</h1>
<ul>
{% load myfilter %}
{% for i in a_list %}
<li> {{ i|oh_no:"这是进阶版的filter" }}</li>
{% endfor %}
</ul>
</body>
</html>
代码实现效果如图
今天就先写到这里吧!!!