django--第四章 模板系统
- 前言
- 模板
- 变量用法
- 标签用法
- 过滤器用法
- 自定义simp-tag和filter
- 模板继承
- include 标签
- 模板
前言
Django 的模板语言旨在在强大和易用之间取得平衡。它旨在让那些习惯于使用 HTML 的人感到舒适。如果您接触过其他基于文本的模板语言,例如Smarty 或Jinja2,那么您应该对 Django 的模板感到宾至如归。
如果您有编程背景,或者如果您习惯于将编程代码直接混合到 HTML 中的语言,您需要牢记 Django 模板系统不仅仅是将 Python 嵌入到 HTML 中。这是设计使然:模板系统旨在表达表示,而不是程序逻辑。
Django 模板系统提供的标签功能与一些编程结构类似——
if布尔测试for标签、循环标签等——但这些不是简单地作为相应的 Python 代码执行,模板系统不会执行任意的 Python 表达式. 默认情况下仅支持下面列出的标签、过滤器和语法(尽管您可以根据需要向模板语言添加自己的扩展)。推荐博客:
模板
模板只是一个文本文件。它可以生成任何基于文本的格式(HTML、XML、CSV 等)。
模板包含变量(在评估模板时用值替换)和标签(控制模板的逻辑)。
Django模板语言的语法主要分为2种:
? {{变量}}:主要用于和视图变量做替换;
? {% tag %}:主要用于做逻辑判断和实现某些功能,正因有了数据+逻辑才构成了模板语言;
应用中如果使用模板,则需要如下步骤:
- *添加模板路径:*修改settings.py配置,在TEMPLATES中修改
DIRS。指定TEMPLATES的目录:
点击查看代码
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 修改内容,templates为目录名
'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',
],
},
},
- 现在修改 appo1\views.py,增加一个新的对象,用于向模板提交数据:
点击查看代码
from django.shortcuts import render
def test(request):
context = {'hello': 'Hello World!'}
return render(request, 'moban.html', context)
- 在 templates 目录下创建 moban.html 文件,写入以下内容:
点击查看代码
模板练习
{% for v in context.values %}
{{v}}
{% endfor %}
- 在 urls.py 文件中加上url:
点击查看代码
from django.urls import path
from app01 import views
urlpatterns = [ path('test/', views.test), ]
- 访问 http://127.0.0.1:8000/test,可以看到页面:
变量用法
当模板引擎遇到一个变量时,它会评估该变量并将其替换为结果。变量名称由字母数字字符和下划线 ( )的任意组合组成,但不能以下划线开头。点 ( ) 也出现在可变部分中,尽管它具有特殊含义,如下所示。重要的是,变量名中不能有空格或标点符号。{{ variable }}``"_"``"." 。使用点 ( .) 访问变量的属性。
从技术上讲,当模板系统遇到一个点时,它会按以下顺序尝试以下查找:
- 字典查找
- 属性或方法查找
- 数字索引查找
如果结果值是可调用的,则不带参数调用它。调用的结果成为模板值。
- 变量:字符串
点击查看代码
# app01/views.py
def moban(request):
name = '变量'
return render(request, 'moban.html', {'name': name})
点击查看代码
# templates/moban.html
模板
{{ name }}
点击查看代码
# urls.py
from django.urls import re_path
from app01 import views
urlpatterns = [re_path('moban/', views.moban),]
再次访问 http://127.0.0.1:8000/moban,可以看到页面:
- 变量:列表
模板文件中,可以用 . 索引下标取出对应的元素。
点击查看代码
# app01/views.py
def moban(request):
name = ['Python', 'Java', 'Go']
return render(request, 'moban.html', {'name': name})
点击查看代码
# templates/moban.html
模板
{{ name }}
{{ name.0 }}
{{ name.2 }}
再次访问 http://127.0.0.1:8000/moban,可以看到页面:
- 变量:字典
模板文件中,可以用 .键 取出对应的值。
点击查看代码
# app01/views.py
def moban(request):
name = { 'k1': 'kk1', 'k2': 'kk2', 'k3': 'kk3' }
return render(request, 'moban.html', {'name': name})
点击查看代码
# templates/moban.html
模板
{{ name }}
{{ name.keys }}
{% for foo in name.values %}
{{ foo }}
{% endfor %}
再次访问 http://127.0.0.1:8000/moban,可以看到页面:
标签用法
如果引用到了视图中的变量,还不足以渲染出一个完美的页面,那就要借助tag标签,做逻辑控制和功能完善了;
- for 标签
语法: {% for %} {% endfor %}
点击查看代码
{% for foo in name.values %}
{{ foo }}
{% endfor %}
- if 标签
语法:{% if ... %} {% elif ... %} {% else %} {% endif %}
点击查看代码
# templates/moban.html
模板
{% if 'k1' in name.keys %}
'k1'
{% elif 'k2' in name.keys %}
'k2'
{% else %}
{{ name.keys }}
{% endif %}