Django模板语言
Django模板是一个简单的文本文档,或用Django模板语言标记的一个Python字符串。 某些结构是被模板引擎解释和识别的。主要的有变量和标签。模板是由context来进行渲染的。渲染的过程是用在context中找到的值来替换模板中相应的变量,并执行相关tags。其他的一切都原样输出。Django模板语言的语法包括四个结构。
Django 项目可以配置一个或多个模板引擎(甚至是零,如果你不需要使用模板)。Django 的模板系统自带内建的后台 —— 称为Django 模板语言(DTL),以及另外一种流行的Jinja2。其他的模板语言的后端,可查找第三方库。
模板引擎通过TEMPLATES 设置来配置。它是一个设置选项列表,与引擎一一对应。默认的值为空。由startproject 命令生成的settings.py 定义了一些有用的值:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
加载模板
get_template('news/story_detail.html')
{{ var_name }}
{% load staticfiles %}
{{ ship_date|date:"Fj,Y"}}
ship_date
变量传给data过滤器,data过滤器通过使用Fj,Y
这几个参数来格式化数据。|
代表类似Unix命令中的管道操作。{% if %}
{% ifequal %}
和{% ifnotequal %}
{% for %}
forloop.counter: 当前循环计数,从1开始
forloop.counter0: 当前循环计数,从0开始
forloop.recounter: 当前循环倒数计数,从列表长度开始
forloop.recounter0: 当前循环倒数计数,从列表长度减1开始,标准
forloop.first: bool值,判断是不是循环的第一个元素
forloop.last: bool值,判断是不是循环的最后一个元素
forloop.parentloop: 用在嵌套循环中,得到parent循环的引用,然后可以使用以上参数
{% cycle %}
{# #}
单行注释,{% comment %}
多行注释{% csrf_token %}
{% debug %}
{% filter %}
{{% autoescape off %}}
{{ value}}
{{% endautoescape %}}
{% firstof %}
{% load %}
{% now %}
{% spaceless %}
{% url %}
{% verbatim %}
{% with %}
{{ value|add:"2" }} # 空格不要乱加
{{ value|cut:" " }}
{{ value|safe }}
{{ some_list|slice:":2" }}
{{ value|truncatechars:5 }}
具体可以查看 内置过滤器参考和 开发自定义过滤器指南这两篇文档.
{% include 'included.html' %}
标签允许在模板中包含其它的模板的内容。
模板可以通过继承来实现复用。首先编写base.html
<html>
<head>
<title>Hello World!</title>
</head>
<body>
{% block mainbody %}
<p>base</p>
{% endblock %}
</body>
</html>
{% block %}
标签通知模板引擎,子模板可以重写这些部分。
{% extends "base.html" %}
{% block mainbody %}
<p>extends base</p>
{% endblock %}
模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。
加载器
模板加载器负责定位模板,加载它们,并返回模板对象.
Django提供几个内置的模板加载器并且支持自定义的模板加载器.
上下文处理器
Context处理器是这样的函数:接收当前的 HttpRequest 作为参数,并返回一个 字典,该字典中包含了将要添加到渲染的context中的数据。
它们的主要用途是添加所有的模板context共享的公共数据,而不需要在每个视图中重复代码。
Django提供了很多 内置的context处理器 . 实现自定义context处理器很简单,只要定义一个函数。
大家使用Django的模板的时候可能都用过{{request.user}}
来获取登录的用户或者判断是否登录呢?那大家有没有想过,我们调用render
方法的时候并没有把request
对象作为参数传给模板啊,为什么就可以直接调用呢?答案就是Django
默认自带了一些context_processors
帮我们把request
对象传给模板,我们来看一下settings.py
这一段代码
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, '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',
],
},
},
]
这里面的context_processors
就是配置模板有哪些context_processors
可以使用。其中django.template.context_processors.request
就是帮我们把request
传递给模板的,我们来看一下
def request(request):
return {'request': request}
可以看到,首先context_processors
就是一个函数,其次,这个函数默认接受一个参数,也就是request
,最后,返回的对象是一个字典,字典的key就是我们在模板里面可以调用的一个上下文。
那么我们来建一个自己的context_processors
context_processors
首先我们在自己app里创建一个context_processors.py
的文件(模块),文件名虽然不是强制要求,但作为规范,建议还是按照规范来
然后里面实现一个context_processors
的函数,比如我们就是把settings
里的某一个参数作为上下文返回,可以这样写
from django.conf import settings # import the settings file
def site_name(request):
# return the value you want as a dictionnary. you may add multiple values in there.
return {'SITE_NAME': settings.SITE_NAME}
说明:
settings.SITE_NAME
是一个自定义的配置,默认并不存在,需要我们手动写。另外可以返回多个值,只要配置多个key和value对儿就可以了。 注意:request
形参必须有,尽管多数用不到。
context_processors
接下来就可以把我们自定义的context_processors
添加到配置文件中
TEMPLATES = [
context_processors
添加到配置文件中
TEMPLATES = [
{
...
'OPTIONS': {
blog
是这个例子的应用名,根据自己的项目做相应修改。
注意:别忘了配置SITE_NAME
哦。
大功告成
这样我们就可以在我们的模板通过{{SITE_NAME}}
等方式调用这个参数了
'context_processors': [
...
'blog.context_processors.site_name',
],
},
},
]
...
SITE_NAME = "社区"
{
...
'OPTIONS': {
'context_processors': [
...
'blog.context_processors.site_name',
],
},
},
]
...
SITE_NAME = "社区"
说明:
blog
是这个例子的应用名,根据自己的项目做相应修改。 注意:别忘了配置SITE_NAME
哦。