zoukankan      html  css  js  c++  java
  • 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处理器很简单,只要定义一个函数。


  • 相关阅读:
    团队冲刺八
    第十一周学习进度
    团队冲刺七
    团队冲刺六
    团队冲刺五
    冲刺第五天
    冲刺第四天
    冲刺第三天
    冲刺第二天
    冲刺第一天
  • 原文地址:https://www.cnblogs.com/fungitive/p/9136156.html
Copyright © 2011-2022 走看看