启动模版
安装jinja2
pip install jinja2
配置setting
TEMPLATES中添加配置
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR,'jinja2')], #模版在项目中的所在位置
}
template中各项的含义
这个配置项中模版自上而下加载,重名优先使用上面的
TEMPLATES = [
{
# 配置哪一种模版
'BACKEND': 'django.template.backends.django.DjangoTemplates', # django默认的自带模版
# 存放模版的目录位置
# 'DIRS': [BASE_DIR / 'templates']
'DIRS': [os.path.join(BASE_DIR,'templates')] # 用os拼接,找到模版所在位置
,
# 模版应用范围,True为全局(整个工程下)
'APP_DIRS': True,
# 其它相关配置
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR,'jinja2')], #模版在项目中的所在位置
}
]
新建jinja2的模版目录
根据新配置的 'DIRS': [os.path.join(BASE_DIR,'jinja2')],新建jinja2文件夹
这样使用在视图中使用render的时候就可以直接找到jinja2目录下的文件了
def go_jinja2(request):
return render(request,"jinja2_home.html")
编辑模版
变量
模版中的变量用{{}}包裹{{变量名}},插值表达式
传入模版的参数可以是字符,数字,对象,列表
<body>
<h1>h1标签</h1>
<p>用户名:{{ username }}</p>
<p>年龄:{{ age }}</p>
<p><img src="{{ img_url }}" alt=""></p>
<p>用户列表</p>
</body>
模版标签
用{%%}包裹循环或判断
<body>
<h1>h1标签</h1>
<p>用户名:{{ username }}</p>
<p>年龄:{{ age }}</p>
<p><img src="{{ img_url }}" alt=""></p>
<p>用户列表</p>
{% for user in list_users %}
<p>{{ user.username }} {{ user.age }}</p>
{% endfor %}
</body>
循环:
循环
{% for user in list_users %} {% endfor %}
字典循环
{% for key,values in data.items %} {% endfor %}
重复循环(循环嵌套)
{% cycle "row1" "row2" %}
循环中的变量
forloop.first | 如果是第一次迭代,为True |
forloop.last | 如果是最后一次迭代,为True |
forloop.counter0 | 计数器,从0开始 |
forloop.counter | 计数器,从1开始 |
eg:
def tag(request):
list_user = [
{"name": "ikun1",
"age": 2.5
},
{"name": "ikun2",
"age": 2.5,
"sex":"沃尔玛购物袋"
}
]
return render(request,"tag.html",{
"list_user":list_user
})
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.row1{
color: red;
}
.row2{
color: green;
}
</style>
</head>
<body>
<h1>用户列表</h1>
{% for i in list_user %}
<p class="{% cycle 'row1' 'row2' %}">第{{ forloop.counter }}个用户</p>
{% for key,value in i.items %}
<p>{{ key }} = {{ value }}</p>
{% endfor %}
{% empty %}
<p>无</p>
{% endfor %}
</body>
判断
{% if 条件 %} {% endif %}
<body>
{% if user.role == 'admin' %}
<p>Hello, Admin!</p>
{% elif user.role == 'editor' %}
<p>Hello, Editor!</p>
{% else %}
<p>Hello, Regular User!</p>
{% endif %}
</body>
url标签
可以获取静态文件,解析静态文件
setting中设置好资源目录和链接
STATIC_URL = "/static/"
STATIC_ROOT = [os.path.join(BASE_DIR,"static")]
# STATICFILES_DIRS = [os.path.join(BASE_DIR,"static")]
<img src="{% static 'images/ikun.jpg' %}" alt="">
时间
见官网
内置模板标签和过滤器 | Django 文档 | Django
eg:
{% now 'j S F Y H:i:s' %}
注释
{# html注释在源代码中能看到内容,标签注释在编译时就将注释内容去掉了 #}
过滤器
首先在模块下新建一个叫templatetags的包
在包下新建过滤器文件
from django import template
register = template.Library()
# 注册过滤器
@register.filter(name='fmt_uname')# 用户名格式化
def fmt_uname(value):
return "{}***".format(value[0])
这样过滤器就创建好了
测试
def mine_filter(request):
username = "三"
return render(request, "mine_filter.html", {
"username": username
})
<p>{{ username | fmt_uname }}</p>