Django之Template

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')

Django模板语言

Django模板是一个简单的文本文档,或用Django模板语言标记的一个Python字符串。 某些结构是被模板引擎解释和识别的。主要的有变量和标签。模板是由context来进行渲染的。渲染的过程是用在context中找到的值来替换模板中相应的变量,并执行相关tags。其他的一切都原样输出。Django模板语言的语法包括四个结构。

变量

变量的值是来自context中的输出, 这类似于字典对象的keys到values的映射关系。

变量是被 {{}}括起来的部分,例如:

My first name is {{ first_name }}. My last name is {{ last_name }}.

字典查询,属性查询和列表索引查找都是通过一个点符号来实现:

{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}

模板中的脚本元素

模板中的脚本元素有3种:

if/elif/else/endif

语法:

{% if condition1 %}
   display 1
{% elif condiiton2 %}
   display 2
{% else %}
   display 3
{% endif %}

根据条件来判断显示的内容,可以使用and,or和not运算符,变量将从上下文中寻找。

for

for允许迭代某一对象,模板引擎将会渲染其中的内容

{% for item in iterable %}
    <p>{{ item }}</p>
 {% endfor %}

示例:

   {% for item in a_list %}
        <p>{{ item }}</p>
    {% endfor %}

a_list必须从context中搜索,模板引擎不支持定义iterable。下列示例将产生语法错误:

  {% for item in ['1','2'] %}
        <p>{{ item }}</p>
    {% endfor %}

支持reversed关键字和嵌套使用:

{% for item in iterable reversed %}

ifequal/ifnotequal

类似{%if%}标签,但可方便的进行比较:

{% ifequal obj1 obj2 %}
   display 1
{% else %}
   display 3
{% endifequal %}

等价于:

{% if obj1 == obj2 %}
   display 1
{% else %}
   display 2
{% endif %}

类似地,有ifnotequal:

{% ifnotequal obj1 obj2 %}
   display 1
{% else %}
   display 2
{% endifnotequal %}

def businesshours(value):
    try:
        return 9 <= value.hour < 17
    except AttributeError:
        return 

标签

标签在渲染的过程中提供任意的逻辑。这个定义是刻意模糊的。例如,一个标签可以输出内容,作为控制结构,例如“if”语句或“for”循环从数据库中提取内容,甚至可以访问其他的模板标签。

Tags是由{%%} 来定义的,例如:

{% csrf_token %}
{% url 'some-url-name' v1 v2 %}

过滤器

过滤器会更改变量或标签参数的值。看上去像这样:

{{ django|title }}

{{ a_list|first|upper }}

上述示例中first过滤器首先取出a_list的首元素,然后由upper过滤器将其转化为大写。

add
把add后的参数加给value
addslashes
在引号前面加上斜杆。例如,用于在CSV中转义字符串。
capfirst
大写变量的第一个字母。如果第一个字符不是字母,该过滤器将不会生效。
cut
移除value中所有的与给出的变量相同的字符串
date
根据给定格式对一个date变量格式化
default
如果value的计算结果为False,则使用给定的默认值。否则,使用该value。
dictsort
接受一个字典列表,并返回按参数中给出的键排序后的列表。


具体可以查看 内置过滤器参考开发自定义过滤器指南这两篇文档.

include模板

{% 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处理器很简单,只要定义一个函数。


猜你喜欢

转载自blog.csdn.net/bbwangj/article/details/79985870
今日推荐