Django 自带模版
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Hello,{{ username }} !
<p>我没有定义的变量:{{ no_defined | default:"我是默认值" }}</p>
<p>我的年龄是:{{ age }}</p>
{% if age > 10 %}
<p>我大于10岁</p>
{% else %}
<p>我不大于10岁</p>
{% endif %}
<p>出生日期是:{{ birthday | date:"Y-m-d H:i:s" }} </p>
<p>朋友有:</p>
<ul>
{# {{ forloop.counter }} 可以取出迭代对象的序号#}
{% for friend in firends %}
<li>{{ forloop.counter }} {{ friend }}</li>
{% endfor %}
</ul>
<p>我共有 {{ firends | length }} 个朋友</p>
<!-- html中列表取值用 list.index 的形式,不能用 list[index] -->
<p>女朋友是:{{ firends.2 }} </p>
<p>工资是:{{ money }}</p>
<p> 2019年工资是:{{ money.2019 }}</p>
<ul>
{# 注释:循环字典的形式 for key ,value in dict.items #}
{% for year, money in money.items %}
<li> {{ forloop.counter }}、{{ year }}年 : {{ money }}元</li>
{% endfor %}
</ul>
{#单行注释#}
{% comment %}
这里是多行注释
{% endcomment %}
<hr>
我的简介是 {{ desc | safe }}
<hr>
</body>
</html>
from django.views import View
class HomeView(View):
def get(self, request):
username = request.GET.get('username')
context = {
'username': username,
'age': 14,
'birthday': datetime.datetime.now(),
'firends': ['tome', 'jack', 'rose'],
'money': {
'2019': 12000,
'2020': 15000,
'2021': 20000
}
}
return render(request, 'index.html', context=context)
1、模版变量
模板变量 {{ var_name }}
变量名必须有字母、数字、下划线(不能以下划线开头)和点组成,语法如下:{{ 变量名 }}
模板变量可以使用python的内建类型(字符串、数字等),也可以是对象(字典、列表、元组等)。
列表取值
html中列表取值用 {{ list.index }} 的形式,不能用 {{ list[index] }};如:friends.2
字典取值
html中字典取单个值要用 {{ dict.name }}的形式,如,salary.2019;
html中字典取所有值,for 循环 {% for key, value in dict**.items** %} ,注意字典变量后面一定要加 .items
2、流程控制
for循环
{{ forloop.counter }} 可以取出迭代对象的序号,如列表,字典;
<!-- {{ forloop.counter }} 可以取出迭代对象的序号 -->
{% for friend in friends %}
<li>{{ forloop.counter }} {{friend }}</li>
{% empty %} <!--列表为空,或不存在时执行此逻辑-->
{% endfor %}
完整的forloop包括:
{‘parentloop’: {}, ‘counter0’: 0, ‘counter’: 1, ‘revcounter’: 3, ‘revcounter0’: 2, ‘first’: True, ‘last’: False} tom
{‘parentloop’: {}, ‘counter0’: 1, 'counter’: 2, ‘revcounter’: 2, ‘revcounter0’: 1, ‘first’: False, ‘last’: False} jack
{‘parentloop’: {}, ‘counter0’: 2, ‘counter’: 3, ‘revcounter’: 1, ‘revcounter0’: 0, ‘first’: False, ‘last’: True} rose
if判断
比较运算符:==、!=、<、>、<=、>=
布尔运算符:and、or、not
注意:运算符左右两侧不能紧挨着变量或常量,必须有空格
{% if age > 10 %}
我大于10岁
{% elif %}
我不大于10岁
{% else %}
我不知道几岁
{% endif %}
注释
{#单行注释#}
{% comment %}
这里是多行注释
{% endcomment %}
3、过滤器(本质为函数)
语法:变量|过滤器:“参数”
使用管道符号|来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中。
如果过滤器需要参数,则使用冒号:传递参数
safe,禁用转义,告诉模板这个变量是安全的,可以解释执行
我的简介是 {{ desc | safe }}
length,长度,返回字符串包含字符的个数,或列表元组字典的元素个数。
<p>我共有 {{ firends | length }} 个朋友</p>
default,默认值,如果变量不存在时则返回默认值。 如datal|default:‘默认值’
<p>我没有定义的变量:{{ no_defined | default:"我是默认值" }}</p>
date,日期,用于对日期类型的值进行字符串格式化常用的格式化字符如下:
<p>出生日期是:{{ birthday | date:"Y-m-d H:i:s" }} </p>
Y表示年,格式为4位,y表示两位的年
m表示月,格式为01.02.12等
d表示日,格式为01.02等
j表示日,格式为12等
H表示时,24进制,h表示12进制的时
i表示分,为0-59
s表示秒,为0-59
如{{ birthday | date:“Y-m-d H:i:s” }}
注意:过滤器中间不能有空格
4、模版继承
父模版
如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。
标签 block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。为了更好的可读性建议给 endblock标签写上名字,这个名字与对应的 block名字相同,父模板中也可以使用上下文中传递过来的数据。
子模版
标签 extends:继承,写在子模板文件的第一行 {% block名称 %}
预留区域,可以编写默认内容,也可以没有默认内容 {% endblock名称 %}
子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值 {% extends “父模板路径” %}
Jinja2模版
Jinja2是 Python下一个被广泛应用的模板引擎,是由 Python实现的模板语言,他的设计思想来源于 Django的模板引擎,并扩展了其语法和一系列强大的功能,尤其是 Flask框架内置的模板语言。
由于django默认模板引擎功能不齐全速度慢,所以我们也可以在 Django中使用jinja2,jinja2宣称比django默认模板引擎快10-20倍。
Django主流的第三方APP基本上也都同时支持Django默认模板及jinjia2,所以要用jinja2也不会有多少障碍。
- 安装
pip3 install Jinja2
设置 BACKEND
为 'django.template.backends.jinja2.Jinja2'
以配置一个 Jinja2 引擎。
默认Jinja2环境'environment': 'jinja2.Environment'
Jinja2模版使用
jinja2模板以函数的形式调用:{{ function(request) }}
重写Jinja2环境,创建jinja2.py
from jinja2 import Environment
from django.template.defaultfilters import date, default, length, safe
def environment(**options):
# 1、创建Environment 实例对象
env = Environment(**options)
# 2、指定(更新)jinja2的函数指向Django的指定过滤器
env.globals.update({
'default': default,
'date': date,
'length': length,
'safe': safe,
})
# 3、返回Environment实例
return env
修改默认jinja2环境
'environment': 'apps.jinja2.environment'
修改pycharm的模板语言为jinja2
jinja2自定义过滤器
Jinja2语法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for book in books %}
<li>{{ book.name }}</li>
{% endfor %}
</ul>
Hello,{{ username }} !
<hr>
<hr>
我的年龄是:{{ age }} <br>
{% if age > 10 %}
我大于10岁
{% else %}
我不大于10岁
{% endif %} <br>
<!-- {# 我没有定义的变量:{{ no_defined | default:"我是默认值" }} #} -->
我没有定义的变量:{{ default(no_defined, "我是默认值") }}
<!-- {# 出生日期是:{{ birthday | date:"Y-m-d H:i:s" }} #} -->
出生日期是:{{ date(birthday, "Y-m-d H:i:s") }} <br>
朋友有:
<ul>
<!-- Django是forloop, jinja2是loop -->
<!-- {# {{ loop.index }} 可以取出迭代对象的序号 #} -->
{% for friend in friends %}
<li>{{ loop.index }} {{friend }}</li>
{% endfor %}
</ul>
<!-- 我共有 {{ friends | length }} 个朋友 <br> -->
我共有 {{ length(friends) }} 个朋友 <br>
<!-- html中列表取值用 list.index 的形式,不能用 list[index] -->
女朋友是:{{ friends.2 }} <br> 工资是:{{ salary }}
<ul>
<!-- {# 注释:django 循环字典的形式 for key ,value in dict.items #} -->
{# {% for year, money in salary.items %} #}
<li> {# {{ loop.index }}:{{ year }} : {{ money }} #}</li>
{# {% endfor %} #}
<!-- jinja2字典取值是dict[key],和Python完全一样 -->
{% for year in salary %}
<li> {{ loop.index }}:{{ year }} : {{ salary[year] }} </li>
{% endfor %}
<li> 2021年工资是:{{ salary['2021'] }}</li>
</ul>
<!-- {# jinja2 没有多行注释,只有单行注释 #} -->
<hr>
<!-- {# 我的简介是 {{ desc | safe }} #} -->
我的简介是 {{ safe(desc) }}
<hr>
</body>
</html>
Django和Jinja2语法差异对比
标签:10,模版,Django,引擎,Jinja2,jinja2,模板 From: https://www.cnblogs.com/zhoubai/p/17157226.html