django 2.1官方文档翻译-模板(进行中)

django的官方文档在transifex上翻译,本来想贡献一下,结果发现那个界面实在是受不了。自己翻吧

模板
作为一个Web框架,Django需要一种动态生成HTML的便捷方式。最常见的方法是使用模板。模板包含HTML输出的静态部分以及能插入动态内容的一些特殊语法。有关使用模板创建HTML页面的实例,请参阅教程3。

Django项目可以配置一个或多个模板引擎(甚至你可以不使用模板从零开始创建HTML)。Django有一个自己的内置模板系统,Django template language(DTL),或者你可以使用一个流行的模板系统Jinja2来替换它。也可以使用从第三方获得的其他模板。

无论后端如何处理,Django定义了一个标准API,用于加载和渲染模板。加载由两步组成,1.查找给定的标识符。2.预处理,把它编译成一个内存中的形式。渲染意味着使用上下文数据插入模板并返回结果字符串。

DTL是Django自己的模板系统。直到Django 1.8,它一直是唯一可用的内置选项。它是一个很好的模板库,尽管它有点僵硬并且具有一些自己的特性。如果您没有特殊的理由用另一个模板,那就应该用DTL,尤其是在您编写可插拔应用程序并打算分发模板时。Django的contrib模块的apps已经包含了模板(如django.contrib.admin使用了DTL)。

由于历史原因,模板引擎的通用支持和Django模板语言的实现都存在于django.template 模块中。

警告

使用不受信任的作者创建的模板并不安全。例如,站点不应允许用户提供自己的模板,因为模板作者可能执行诸如执行XSS攻击、访问可能包含敏感信息的模板变量属性之类的操作。

模板引擎的支持
配置
模板引擎可以使用settings中的TEMPLATES来指定。这是一个配置列表,列表的每一项对应一个引擎。默认是空的。startproject生成的 settings.py产生一个有用的值:

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

BACKEND是一个用.分割的python路径,描述了模板引擎类所在的位置,这个类提供了Django的模板backend API。内建的backend有 django.template.backends.django.DjangoTemplates和django.template.backends.jinja2.Jinja2。
由于大多数引擎从文件加载模板,因此每个引擎的顶级配置包含两个常用设置:

  • DIRS: 定义一个列表存放目录,引擎应按顺序从中查找模板源文件。
  • APP_DIRS:告诉引擎是否应该在已安装的应用程序文件夹中查找模板。app该为每个backend都在自己目录下创建一个子文件夹存放模板。

虽然不常见,但同一模板backend可以搞几个不同的实例。在这种情况下,应该为每个实例新建一个列表项。

OPTIONS 包含backend-specific的设置。

使用方法
django.template.loader模块定义了加载模板的两个函数
get_template(template_name,using = None)
此函数使用给定的名称加载模板并返回一个 Template对象。

返回值的确切类型取决于使用的backend。每个backend都有自己的Template类。

get_template()按顺序尝试每个模板引擎,直到成功。如果找不到模板,则会引起一个 TemplateDoesNotExist异常。如果找到模板但其中包含无效语法,则会引起一个 TemplateSyntaxError异常。

如何搜索和加载模板取决于每个引擎自己的backend和配置。

如果你要使用特定的模板引擎,请在using参数中传递引擎NAME。

select_template(template_name_list, using=None)
select_template()和get_template()差不多,但是它接受一个模板名称的列表。它按顺序尝试每个名称并返回能找到的第一个模板。

如果加载模板失败,可能引起django.template中定义的两个异常 :
exception TemplateDoesNotExist(msg, tried=None, backend=None, chain=None)
无法找到模板时引发此异常。它接受以下可选参数,用于在调试页面上填充template postmortem:

backend
发生异常的模板后端实例。
tried
查找模板时尝试的源位置列表。被格式化为一个列表,每个列表项为包含(origin, status)的元组,其中origin是origin-like的对象,status 是一个描述了为什么没找到模板的字符串。
chain
TemplateDoesNotExist 尝试加载模板时引发的中间异常列表。这是给一些函数比如get_template用的,当get_template尝试从多个引擎加载给定模板时用的到。

/*
译注:可以尝试一下load一个不存在的模板名,会发现template postmortem块的信息

Template-loader postmortem
Django tried loading these templates, in this order:

Using engine django:

django.template.loaders.filesystem.Loader: /home/songyf/Desktop/auth/templates/indx.html (Source does not exist)
django.template.loaders.app_directories.Loader: /usr/local/lib/python3.6/dist-packages/django/contrib/admin/templates/indx.html (Source does not exist)
django.template.loaders.app_directories.Loader: /usr/local/lib/python3.6/dist-packages/django/contrib/auth/templates/indx.html (Source does not exist)
chain	[TemplateDoesNotExist('indx.html',)]
engine	
engines	[]
template_name	'indx.html'
using	None

*/

异常 TemplateSyntaxError(msg)
找到模板但包含错误时会引发此异常。
返回的Template对象必须接着使用一个render()方法:
Template.render(context = None,request = None)
在给定的上下文中呈现此模板。
context必须是一个dict,如果没提供,引擎会用一个空的上下文渲染模板。
request必须是一个HttpRequest。然后引擎必须在模板中提供它以及CSRF令牌。如何实现这一目标取决于不同的backend。

展示搜索算法的一个例子。比如 TEMPLATES设置为:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            '/home/html/example.com',
            '/home/html/default',
        ],
    },
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [
            '/home/html/jinja2',
        ],
    },
]

如果你调用 get_template(‘story_detail.html’), Django会这么寻找:

  • /home/html/example.com/story_detail.html (‘django’ engine)
  • /home/html/default/story_detail.html (‘django’ engine)
  • /home/html/jinja2/story_detail.html (‘jinja2’ engine)

如果你调用select_template([‘story_253_detail.html’, ‘story_detail.html’]), Django会这么找:

  • /home/html/example.com/story_253_detail.html (‘django’ engine)
  • /home/html/default/story_253_detail.html (‘django’ engine)
  • /home/html/jinja2/story_253_detail.html (‘jinja2’ engine)
  • /home/html/example.com/story_detail.html (‘django’ engine)
  • /home/html/default/story_detail.html (‘django’ engine)
  • /home/html/jinja2/story_detail.html (‘jinja2’ engine)

当Django找到存在的模板时,它会停止查找。

tips:
您可以使用select_template()进行更灵活的模板加载。例如,如果您撰写了新闻报道并希望某些故事具有自定义的模板,请使用类似这样的函数:select_template([‘story_%s_detail.html’ % story.id, ‘story_detail.html’]) 。这将允许您为单个故事使用自定义模板,并为没有自定义模板的故事提供后备模板。

尽可能在每个包含模板的文件夹中用一个子文件夹组织模板 。惯例是为每个Django应用程序创建一个子目录,并根据需要在这些子目录中包含子目录。

这样做是为了你自己好。将所有模板存储在根目录会变得很混乱。

要加载子目录中的模板,只需使用斜杠,如下所示:

get_template('news/story_detail.html')

你可能感兴趣的:(django 2.1官方文档翻译-模板(进行中))