侧边栏壁纸
  • 累计撰写 122 篇文章
  • 累计创建 68 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Django基础-模板

刘少锋
2022-01-19 / 0 评论 / 0 点赞 / 30 阅读 / 1,119 字

作为一个Web框架,Django需要一种动态生成HTML的便捷方法。最常用的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述动态内容将被插入的一些特殊语法。

一个 Django 项目可以配置一个或多个模板引擎(如果不使用模板,甚至为零)。Django 为其自己的模板系统(创造性地称为 Django 模板语言 (DTL))和流行的替代方案Jinja2提供了内置引擎。其他模板语言的引擎可以从第三方获得。

支持模板引擎

模板引擎使用该TEMPLATES设置进行配置。这是一个配置列表,每个引擎一个。默认值为空。startproject命令生成的settings.py定义了一些有用的值:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

BACKEND是实现 Django 模板后端 API 的模板引擎类的虚拟 Python 路径。内置后端是django.template.backends.django.DjangoTemplatesdjango.template.backends.jinja2.Jinja2

由于大多数引擎从文件加载模板,因此每个引擎的顶级配置包含两个常见设置:

  • DIRS 定义引擎应按搜索顺序查找模板源文件的目录列表。
  • APP_DIRS告诉引擎是否应该在已安装的应用程序中查找模板。每个后端为应存储其模板的应用程序内的子目录定义一个常规名称。

虽然不常见,但可以使用不同的选项配置同一后端的多个实例。在这种情况下,您应该为每个引擎定义一个唯一的 NAME

OPTIONS 包含引擎特定的设置。

Django 模板语言

语法

Django 模板只是使用 Django 模板语言标记的文本文档或 Python 字符串。模板引擎可以识别和解释一些结构。主要的是变量和标签。

使用上下文呈现模板。渲染用它们的值替换变量,这些值在上下文中查找,并执行标签。其他一切都按原样输出。

Django 模板语言的语法涉及四种结构。

变量

变量从上下文中输出一个值,这是一个类似字典的对象,将键映射到值。

变量被像这样的{{}}包围:

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

使用 的上下文,此模板呈现为:{'first_name': 'John', 'last_name': 'Doe'}

My first name is John. My last name is Doe.

字典查找、属性查找和列表索引查找是用点符号实现的:

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

如果变量解析为可调用对象,模板系统将不带参数调用它,并使用其结果而不是可调用对象。

标签

标签在渲染过程中提供任意逻辑。

这个定义是故意模糊的。例如,标签可以输出内容,用作控制结构,例如“if”语句或“for”循环,从数据库中获取内容,甚至可以访问其他模板标签。

标签被包围{%并且%}像这样:

{% csrf_token %}

大多数标签接受参数:

{% cycle 'odd' 'even' %}

一些标签需要开始和结束标签:

{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}

更多标签参考官方文档内置标签

过滤器

过滤器转换变量和标签参数的值。

它们看起来像这样:

{{ django | title }}

当上下文为:{'django': 'the web framework for perfectionists with deadlines'} ,模板引擎将渲染为:

The Web Framework For Perfectionists With Deadlines

一些过滤器接受一个参数:

{{ my_date|date:"Y-m-d" }}

更多信息,参考官方文档内置过滤器以及编写自定义过滤器

注释

单行注释

注释看起来像这样:

{# this won't be rendered #}
多行注释

{% comment %}{% endcomment %} 标签之间的内容将会被注释。

可以在第一个标记中插入一个可选注释。例如,在注释代码时, 说明禁用代码的原因时,非常有用。

<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
    <p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}

comment 标签不能嵌套。

0

评论区