{"title":"The Django template language","version":"2.2","locale":"zh-hans","docname":"ref/templates/language","url":"/zh-hans/2.2/ref/templates/language/","canonical":"https://djangodocs.dev/zh-hans/2.2/ref/templates/language/","summary":"本文档介绍了Django模板系统语言的语法. 如果你希望从一个更技术的角度来看它是如何工作的和如何扩展它, 请参阅 The Django template language: for Python programmers . Django's template language is designed to strike a…","html":"<h1>The Django template language<a class=\"heading-anchor\" href=\"#the-django-template-language\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>本文档介绍了Django模板系统语言的语法. 如果你希望从一个更技术的角度来看它是如何工作的和如何扩展它, 请参阅 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/api/\"><span class=\"doc\">The Django template language: for Python programmers</span></a>.</p>\n<p>Django's template language is designed to strike a balance between power and\nease. It's designed to feel comfortable to those used to working with HTML. If\nyou have any exposure to other text-based template languages, such as <a class=\"reference external\" href=\"https://www.smarty.net/\">Smarty</a>\nor <a class=\"reference external\" href=\"http://jinja.pocoo.org/\">Jinja2</a>, you should feel right at home with Django's templates.</p>\n<aside class=\"admonition-philosophy admonition\">\n<p class=\"admonition-title\">设计哲学</p>\n<p>如果你有编程背景,或者你使用过PHP等嵌入HTML的程序语言,你要牢记, Django的模板系统是不是简单的把Python嵌入到HTML中. 它的设计是: 模板系统旨在展示内容, 而不是程序逻辑.</p>\n<p>jango的模板系统提供的标签, 其功能类似于一些编程结构 -- <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">if</span></code></a> 标签用于布尔值测试, <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">for</span></code></a> 标签用来做for循环, 等等.但这些都不是简单的执行相应的Python代码,模板系统不会执行任意的Python表达式. 通常情况下, 模板系统仅支持接下来列出的这些标签和过滤 (仅当需要时你可以添加 <a class=\"reference internal\" href=\"/zh-hans/2.2/howto/custom-template-tags/\"><span class=\"doc\">你自己的扩展</span></a> 到模板语法中).</p>\n</aside>\n<section id=\"templates\">\n<h2>模板<a class=\"heading-anchor\" href=\"#templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>模板是一个简单的文本文件.它可以生成任何基于文本的格式（如 HTML,XML,CSV等）.</p>\n<p>模板中包含的 <strong>变量</strong> 被替换为变量的值, <strong>标签</strong> 被替换为相应的模板控制逻辑.</p>\n<p>Below is a minimal template that illustrates a few basics. Each element will be\nexplained later in this document.</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base_generic.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}{{</span> <span class=\"nv\">section.title</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">section.title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">story</span> <span class=\"k\">in</span> <span class=\"nv\">story_list</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">story.get_absolute_url</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">story.headline</span><span class=\"o\">|</span><span class=\"nf\">upper</span> <span class=\"cp\">}}</span>\n  <span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">story.tease</span><span class=\"o\">|</span><span class=\"nf\">truncatewords</span><span class=\"s2\">:&quot;100&quot;</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition-philosophy admonition\">\n<p class=\"admonition-title\">设计哲学</p>\n<p>为什么要使用基于文本的模板,而不是基于XML语法的（如Zope的TAL）？ 我们希望Django的模板语言不止是 XML/HTML. 在网络世界,它可以不止被用在电子邮件,JavaScript和CSV中. 您可以在任何文本格式中使用它.</p>\n<p>Oh, and one more thing: making humans edit XML is sadistic!</p>\n</aside>\n</section>\n<section id=\"variables\">\n<span id=\"template-variables\"></span><h2>变量<a class=\"heading-anchor\" href=\"#variables\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Variables look like this: <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">variable</span> <span class=\"pre\">}}</span></code>. When the template engine\nencounters a variable, it evaluates that variable and replaces it with the\nresult. Variable names consist of any combination of alphanumeric characters\nand the underscore (<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;_&quot;</span></code>) but may not start with an underscore. The dot\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;.&quot;</span></code>) also appears in variable sections, although that has a special\nmeaning, as indicated below. Importantly, <em>you cannot have spaces or\npunctuation characters in variable names.</em></p>\n<p>使用点 (<code class=\"docutils literal notranslate\"><span class=\"pre\">.</span></code>) 来访问变量的属性.</p>\n<aside class=\"admonition-behind-the-scenes admonition\">\n<p class=\"admonition-title\">幕后</p>\n<p>从技术上讲,当模板系统遇到一个点,它会尝试下面的动作,顺序如下:</p>\n<ul class=\"simple\">\n<li><p>字典查询</p></li>\n<li><p>Attribute or method lookup</p></li>\n<li><p>Numeric index lookup</p></li>\n</ul>\n<p>If the resulting value is callable, it is called with no arguments. The\nresult of the call becomes the template value.</p>\n<p>This lookup order can cause some unexpected behavior with objects that\noverride dictionary lookup. For example, consider the following code snippet\nthat attempts to loop over a <code class=\"docutils literal notranslate\"><span class=\"pre\">collections.defaultdict</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">k</span><span class=\"o\">,</span> <span class=\"nv\">v</span> <span class=\"k\">in</span> <span class=\"nv\">defaultdict.items</span> <span class=\"cp\">%}</span>\n    Do something with k and v here...\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Because dictionary lookup happens first, that behavior kicks in and provides\na default value instead of using the intended <code class=\"docutils literal notranslate\"><span class=\"pre\">.items()</span></code> method. In this\ncase, consider converting to a dictionary first.</p>\n</aside>\n<p>在上面的例子中, <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">section.title</span> <span class=\"pre\">}}</span></code> 将被替换为这个对象的title属性值.</p>\n<p>If you use a variable that doesn't exist, the template system will insert the\nvalue of the <code class=\"docutils literal notranslate\"><span class=\"pre\">string_if_invalid</span></code> option, which is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code> (the empty\nstring) by default.</p>\n<p>Note that &quot;bar&quot; in a template expression like <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">foo.bar</span> <span class=\"pre\">}}</span></code> will be\ninterpreted as a literal string and not using the value of the variable &quot;bar&quot;,\nif one exists in the template context.</p>\n<p>Variable attributes that begin with an underscore may not be accessed as\nthey're generally considered private.</p>\n</section>\n<section id=\"filters\">\n<h2>过滤器<a class=\"heading-anchor\" href=\"#filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>您可以通过使用 <strong>过滤器</strong> 修改变量的显示.</p>\n<p>过滤器用起来像这样： <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">name|lower</span> <span class=\"pre\">}}</span></code> . 通过过滤器 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-lower\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">lower</span></code></a> 变量 <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">name</span> <span class=\"pre\">}}</span></code> 变为了小写字符. 通过管道符 (<code class=\"docutils literal notranslate\"><span class=\"pre\">|</span></code>) 间隔变量和过滤器来使用过滤器.</p>\n<p>过滤器可以是 &quot;链式的&quot;. 一个过滤器的输出作为下一个过滤器的输入. <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">text|escape|linebreaks</span> <span class=\"pre\">}}</span></code> 是一种常用的转换方式, 在这之后换行符被替换为了 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;p&gt;</span></code> 标签.</p>\n<p>有些过滤器是带有参数的. 一个带参数的过滤器看起来像这样: <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">bio|truncatewords:30</span> <span class=\"pre\">}}</span></code>. 他会显示 <code class=\"docutils literal notranslate\"><span class=\"pre\">bio</span></code> 变量的前30个字符.</p>\n<p>Filter arguments that contain spaces must be quoted; for example, to join a\nlist with commas and spaces you'd use <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">list|join:&quot;,</span> <span class=\"pre\">&quot;</span> <span class=\"pre\">}}</span></code>.</p>\n<p>Django provides about sixty built-in template filters. You can read all about\nthem in the <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#ref-templates-builtins-filters\"><span class=\"std std-ref\">built-in filter reference</span></a>.\nTo give you a taste of what's available, here are some of the more commonly\nused template filters:</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-default\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">default</span></code></a></dt><dd><p>If a variable is false or empty, use given default. Otherwise, use the\nvalue of the variable. For example:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">default</span><span class=\"s2\">:&quot;nothing&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> 没有提供或者为空，那么他将显示为 &quot;<code class=\"docutils literal notranslate\"><span class=\"pre\">nothing</span></code>&quot; .</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-length\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">length</span></code></a></dt><dd><p>Returns the length of the value. This works for both strings and lists.\nFor example:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">['a',</span> <span class=\"pre\">'b',</span> <span class=\"pre\">'c',</span> <span class=\"pre\">'d']</span></code>, 那么他将被显示为 <code class=\"docutils literal notranslate\"><span class=\"pre\">4</span></code>.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-filesizeformat\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">filesizeformat</span></code></a></dt><dd><p>Formats the value like a &quot;human-readable&quot; file size (i.e. <code class=\"docutils literal notranslate\"><span class=\"pre\">'13</span> <span class=\"pre\">KB'</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'4.1</span> <span class=\"pre\">MB'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'102</span> <span class=\"pre\">bytes'</span></code>, etc.). For example:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">filesizeformat</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> is 123456789, the output would be <code class=\"docutils literal notranslate\"><span class=\"pre\">117.7</span> <span class=\"pre\">MB</span></code>.</p>\n</dd>\n</dl>\n<p>这些只是几个例子，请参阅  <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#ref-templates-builtins-filters\"><span class=\"std std-ref\">内置过滤器参考</span></a> 的完整列表.</p>\n<p>您还可以创建自己的自定义模板过滤器，请参见 <a class=\"reference internal\" href=\"/zh-hans/2.2/howto/custom-template-tags/\"><span class=\"doc\">自定义模板（template）的标签（tags）和过滤器（filters）</span></a>.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p>Django的管理界面可以在一个给定的站点中包含所有的模板标签和过滤器的完整参考. 请参阅 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/contrib/admin/admindocs/\"><span class=\"doc\">The Django admin documentation generator</span></a>.</p>\n</aside>\n</section>\n<section id=\"tags\">\n<h2>标签(Tags)<a class=\"heading-anchor\" href=\"#tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>标签看起来像这样: <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">tag</span> <span class=\"pre\">%}</span></code>. 标签要比变量更复杂: 有些标签会创建一段文本, 有些标签会控制输出流的方式比如循环或逻辑条件, 还有些标签会添加一些扩展内容到模板中, 比如另外的标签和过滤器.</p>\n<p>有些标签在使用时需要有开始和结束标签 (像这样 <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">tag</span> <span class=\"pre\">%}</span> <span class=\"pre\">...</span> <span class=\"pre\">内容</span> <span class=\"pre\">...</span> <span class=\"pre\">{%</span> <span class=\"pre\">endtag</span> <span class=\"pre\">%}</span></code>).</p>\n<p>Django内置了大约二十几个标签. 你可以在 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#ref-templates-builtins-tags\"><span class=\"std std-ref\">内置标签参考</span></a> 阅读有关内置标签的内容. 为了让你尝试有什么可用的, 这里有一些常用标签的例子:</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">for</span></code></a></dt><dd><p>循环数组中的每个元素.  比如, 显示列表 <code class=\"docutils literal notranslate\"><span class=\"pre\">athlete_list</span></code> 中每个元素的 <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> 属性:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">athlete</span> <span class=\"k\">in</span> <span class=\"nv\">athlete_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">athlete.name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">if</span></code></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">elif</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">else</span></code></dt><dd><p>判断一个变量的布尔值, 如果它为 &quot;true&quot; 则显示 <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span></code> 块儿内的内容, 否则显示 <code class=\"docutils literal notranslate\"><span class=\"pre\">else</span></code> 块儿内的文字:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">athlete_list</span> <span class=\"cp\">%}</span>\n    Number of athletes: <span class=\"cp\">{{</span> <span class=\"nv\">athlete_list</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">elif</span> <span class=\"nv\">athlete_in_locker_room_list</span> <span class=\"cp\">%}</span>\n    Athletes should be out of the locker room soon!\n<span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n    No athletes.\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>In the above, if <code class=\"docutils literal notranslate\"><span class=\"pre\">athlete_list</span></code> is not empty, the number of athletes\nwill be displayed by the <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">athlete_list|length</span> <span class=\"pre\">}}</span></code> variable. Otherwise,\nif <code class=\"docutils literal notranslate\"><span class=\"pre\">athlete_in_locker_room_list</span></code> is not empty, the message &quot;Athletes\nshould be out...&quot; will be displayed. If both lists are empty,\n&quot;No athletes.&quot; will be displayed.</p>\n<p>也可以在 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">if</span></code></a> 标签里使用过滤器和各种操作符:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">athlete_list</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"o\">&gt;</span> <span class=\"m\">1</span> <span class=\"cp\">%}</span>\n   Team: <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">athlete</span> <span class=\"k\">in</span> <span class=\"nv\">athlete_list</span> <span class=\"cp\">%}</span> ... <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n   Athlete: <span class=\"cp\">{{</span> <span class=\"nv\">athlete_list.0.name</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>While the above example works, be aware that most template filters return\nstrings, so mathematical comparisons using filters will generally not work\nas you expect. <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-length\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">length</span></code></a> is an exception.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> and <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-extends\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">extends</span></code></a></dt><dd><p>请看 <a class=\"reference internal\" href=\"#id1\">模板继承</a> (在下面), 一个强大的方法, 在模板上切割下来的&quot;样板&quot;.</p>\n</dd>\n</dl>\n<p>以上的例子只是整个标签列表的一小部分; 请参看 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#ref-templates-builtins-tags\"><span class=\"std std-ref\">内置标签参考</span></a> 完整阅览.</p>\n<p>您还可以创建自己的自定义模板标签, 请参看 <a class=\"reference internal\" href=\"/zh-hans/2.2/howto/custom-template-tags/\"><span class=\"doc\">自定义模板（template）的标签（tags）和过滤器（filters）</span></a>.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p>Django的管理界面可以在一个给定的站点中包含所有的模板标签和过滤器的完整参考. 请参阅 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/contrib/admin/admindocs/\"><span class=\"doc\">The Django admin documentation generator</span></a>.</p>\n</aside>\n</section>\n<section id=\"comments\">\n<span id=\"template-comments\"></span><h2>注释(Comments)<a class=\"heading-anchor\" href=\"#comments\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>要注释掉行的一部分,在模板中使用注释语法: <code class=\"docutils literal notranslate\"><span class=\"pre\">{#</span> <span class=\"pre\">#}</span></code>.</p>\n<p>例如,该模板将呈现为 <code class=\"docutils literal notranslate\"><span class=\"pre\">'hello'</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"c\">{# greeting #}</span>hello\n</code></pre></div>\n<p>注释可以包含任何模板代码, 使其生效或无效. 例如:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"c\">{# {% if foo %}bar{% else %} #}</span>\n</code></pre></div>\n<p>这个语法只能用于单行注释 (不允许在 <code class=\"docutils literal notranslate\"><span class=\"pre\">{#</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">#}</span></code> 之间换行). 如果您需要注释掉多行部分的模板, 参见 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">comment</span></code></a> 标签.</p>\n</section>\n<section id=\"template-inheritance\">\n<span id=\"id1\"></span><h2>模板继承<a class=\"heading-anchor\" href=\"#template-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django模板中最强大和最复杂的部分就是模板继承. 模板继承允许你建立一个基本的&quot;骨架&quot;模板, 它包含了你网站所有常见的元素,并定义了可以被子模板覆盖的 <strong>块(blocks)</strong> .</p>\n<p>这是最简单的理解模板继承的一个例子:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span> <span class=\"na\">lang</span><span class=\"o\">=</span><span class=\"s\">&quot;en&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">link</span> <span class=\"na\">rel</span><span class=\"o\">=</span><span class=\"s\">&quot;stylesheet&quot;</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;style.css&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>My amazing site<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;sidebar&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">sidebar</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/&quot;</span><span class=\"p\">&gt;</span>Home<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/blog/&quot;</span><span class=\"p\">&gt;</span>Blog<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n\n    <span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;content&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>我们称这个模板为 <code class=\"docutils literal notranslate\"><span class=\"pre\">base.html</span></code>, 定义了一个简单的 HTML 骨架文档, 假设这是一个简单的两列页面. 子模板的工作就是填充空的 <code class=\"docutils literal notranslate\"><span class=\"pre\">块(block)</span></code> 中的内容.</p>\n<p>在这个例子中, <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> 标签定义了三个可以被子模板填充的块. <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> 标签告诉了模板系统哪些地方可能被子模板覆盖.</p>\n<p>一个子模板可能看起来像这样:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>My amazing blog<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">entry</span> <span class=\"k\">in</span> <span class=\"nv\">blog_entries</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">entry.title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">entry.body</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-extends\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">extends</span></code></a> 标签是这里的关键. 它告诉模板系统这个模板继承了另外的模板. 当模板系统对此模板进行运算, 首先会寻找他的父模板 -- 在这里是&quot;base.html&quot;.</p>\n<p>在这一点上, 模板引擎会在 <code class=\"docutils literal notranslate\"><span class=\"pre\">base.html</span></code> 中发现三个 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> 标签, 并且使用子模板的内容替换掉这些块. 根据变量 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog_entries</span></code> 的值, 输出可能看起来像这样:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span> <span class=\"na\">lang</span><span class=\"o\">=</span><span class=\"s\">&quot;en&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">link</span> <span class=\"na\">rel</span><span class=\"o\">=</span><span class=\"s\">&quot;stylesheet&quot;</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;style.css&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>My amazing blog<span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;sidebar&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/&quot;</span><span class=\"p\">&gt;</span>Home<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/blog/&quot;</span><span class=\"p\">&gt;</span>Blog<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n\n    <span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;content&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>Entry one<span class=\"p\">&lt;/</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>This is my first entry.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n\n        <span class=\"p\">&lt;</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>Entry two<span class=\"p\">&lt;/</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>This is my second entry.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>需要注意的是, 因为子模板没有定义 <code class=\"docutils literal notranslate\"><span class=\"pre\">sidebar</span></code> 块, 那么父模板的内容就会被使用. 通常来说, 父模板 <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code> 中的内容会被作为备用的内容.</p>\n<p>在你需要时, 可以有多个层次的继承关系. 使用模板继承的一个常用方案是像以下的三层继承.</p>\n<ul class=\"simple\">\n<li><p>创建一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">base.html</span></code> 模板把控你网站的整体风格.</p></li>\n<li><p>为网站的每个子分类创建一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">base_SECTIONNAME.html</span></code> 模板. 比如, <code class=\"docutils literal notranslate\"><span class=\"pre\">base_news.html</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">base_sports.html</span></code>. 这些模板都继承 <code class=\"docutils literal notranslate\"><span class=\"pre\">base.html</span></code> 模板. 这些模板中包含特定的设计/风格.</p></li>\n<li><p>为每一种类型的页面创建一个模板, 比如 <code class=\"docutils literal notranslate\"><span class=\"pre\">news</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">article</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog</span></code> 内容. 这些模板扩展上一级模板的相应分类.</p></li>\n</ul>\n<p>这种方法最大限度地重用了代码并能很容易将元素添加到公用的区域, 比如分类导航.</p>\n<p>这里有一些关于模板继承的提示</p>\n<ul>\n<li><p>如果你在模板中使用 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-extends\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">%}</span></code></a>, 他必须位于模板的最开始. 如果在其他的部分声明, 则不生效.</p></li>\n<li><p>在你的基础模板中使用更多的 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code></a> 是一个好的方法. 请记住, 子模板不需要定义所有父模板中的块, 所以你可以在若干的块中填充默认值, 然后定义之后需要的块. 有更多的可用块总是更好的.</p></li>\n<li><p>如果你发现自己在许多模板中有重复内容的了, 这可能意味着你要移动这些内容到父模板的 <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code> 中.</p></li>\n<li><p>如果你需要得到父模板块中的内容, 可以用 <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">block.super</span> <span class=\"pre\">}}</span></code> 变量. 这在你想使用父模板块中的内容又想在其中追加内容时是非常有用的. 使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">block.super</span> <span class=\"pre\">}}</span></code> 插入的数据不会被自动转义 (参见 <a class=\"reference external\" href=\"#automatic-html-escaping\">下一节</a>), 因为它已经被转义了. 如果需要转义, 可以在父模板中转义.</p></li>\n<li><p>Variables created outside of a <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code></a> using the template\ntag <code class=\"docutils literal notranslate\"><span class=\"pre\">as</span></code> syntax can't be used inside the block. For example, this template\ndoesn't render anything:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">trans</span> <span class=\"s2\">&quot;Title&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{{</span> <span class=\"nv\">title</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</li>\n<li><p>更好的可读性, 你可以给 <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endblock</span> <span class=\"pre\">%}</span></code> 标签定义一个 <em>名字</em>. 比如:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n...\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>在一个较长的模板中, 这个方法可以让你知道是哪一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code> 标签定义结束了.</p>\n</li>\n</ul>\n<p>最后请注意, 你不能在同一模板中定义多个具有相同名称的块标签. 存在这个限制是因为 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> 标签是&quot;双向&quot;定义的. 也就是说, 它不仅指定了子模板要填充哪个&quot;洞&quot;, 也说明了子模板要引用那些父模板的内容. 所以在有多个同名 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> 标签时, 父模板就不知道到底要引用哪个块的内容了.</p>\n</section>\n<section id=\"automatic-html-escaping\">\n<span id=\"id2\"></span><h2>自动HTML转义<a class=\"heading-anchor\" href=\"#automatic-html-escaping\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>从模板生成HTML时, 总是有一种风险, 即一个变量将会影响生成的HTML字符. 例如, 考虑这个模板片段:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Hello, <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>At first, this seems like a harmless way to display a user's name, but consider\nwhat would happen if the user entered their name as this:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span><span class=\"nx\">alert</span><span class=\"p\">(</span><span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">)&lt;/</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>当名字为这个值, 该模板将呈现为:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Hello, <span class=\"p\">&lt;</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span><span class=\"nx\">alert</span><span class=\"p\">(</span><span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">)&lt;/</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>...这意味着浏览器将弹出一个JavaScript警告框!</p>\n<p>同样的, 如果名字中包含一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">'&lt;'</span></code> 符号, 像这样:</p>\n<div class=\"code-block\" data-language=\"html\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Html code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>username\n</code></pre></div>\n<p>这将导致呈现出这样的模板:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Hello, <span class=\"p\">&lt;</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>username\n</code></pre></div>\n<p>...这意味着在此之后的文字将呈现为粗体!</p>\n<p>显然, 用户提交的数据是不可靠的且不应被直接插入到您的网页, 因为恶意用户可以使用这种潜在的漏洞做不好的事情. 这种类型的安全漏洞被称为 <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Cross-site_scripting\">Cross Site Scripting (跨站脚本)</a> (XSS) 攻击.</p>\n<p>为了避免这个问题, 你有两种选择:</p>\n<ul class=\"simple\">\n<li><p>一, 确保让不受信任的变量经过了 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-escape\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">escape</span></code></a> 过滤器 (下文介绍), 将危险的HTML字符替换为无害的HTML转义字符. 这在Django最初时是默认的方案, 它使得 <em>你</em>, 开发者, 有责任确保在必要时转义了变量. 但是人们很容易忽略它.</p></li>\n<li><p>二, 你可以用Django的自动HTML转义. 本节的其余部分介绍了自动转义如何工作.</p></li>\n</ul>\n<p>在Django中, 默认每个模板会自动转义输出的每一个变量标签. 具体来说, 这五个字符会被转义:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;</span></code> 被替换为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;lt;</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&gt;</span></code> 被替换为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;gt;</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'</span></code> (单引号) 被替换为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;#39;</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;</span></code> (双引号) 被替换为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;quot;</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span></code> 被替换为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;amp;</span></code></p></li>\n</ul>\n<p>再次强调, 这种行为是默认的. 如果你使用的是Django的模板系统, 你是受保护的.</p>\n<section id=\"how-to-turn-it-off\">\n<h3>如何关闭它<a class=\"heading-anchor\" href=\"#how-to-turn-it-off\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你不希望数据被自动转义, 你可以在站点, 模板, 变量这三个层面关闭它.</p>\n<p>为什么你会想要把它关掉? 因为有时候, 你希望把模板变量中包含的数据作为原始的HTML渲染, 在这种情况下, 你不希望自己的内容被转义. 例如, 你可能在你的数据库的BLOB字段存储HTML, 并希望直接嵌入到您的模板. 或者你使用Django的模板系统生成不是HTML的文本 -- 比如电子邮件正文.</p>\n<section id=\"for-individual-variables\">\n<h4>对于单个变量<a class=\"heading-anchor\" href=\"#for-individual-variables\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>要为一个单独的变量禁用自动转义, 使用 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-safe\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">safe</span></code></a> 过滤器:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>This will be escaped: <span class=\"cp\">{{</span> <span class=\"nv\">data</span> <span class=\"cp\">}}</span>\nThis will not be escaped: <span class=\"cp\">{{</span> <span class=\"nv\">data</span><span class=\"o\">|</span><span class=\"nf\">safe</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p><em>safe</em> 可以被认为是 <em>safe from further escaping</em> 或 <em>can be safely interpreted as HTML</em> 的简写. 在这个例子中, 如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">data</span></code> 是 <code class=\"docutils literal notranslate\"><span class=\"pre\">'&lt;b&gt;'</span></code>, 那么输出将会是:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>This will be escaped: <span class=\"ni\">&amp;lt;</span>b<span class=\"ni\">&amp;gt;</span>\nThis will not be escaped: <span class=\"p\">&lt;</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"for-template-blocks\">\n<h4>对于模板文本块<a class=\"heading-anchor\" href=\"#for-template-blocks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>要在模板中控制自动转义, 可以在整个模板 (或者模板的特定区域) 使用 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-autoescape\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">autoescape</span></code></a> 标签, 如:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">autoescape</span> <span class=\"nv\">off</span> <span class=\"cp\">%}</span>\n    Hello <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endautoescape</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-autoescape\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">autoescape</span></code></a> 标签接受 <code class=\"docutils literal notranslate\"><span class=\"pre\">on</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">off</span></code> 作为参数. 有时, 你希望自动转义在某个区域被禁用. 如这个模板的例子:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Auto-escaping is on by default. Hello <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">autoescape</span> <span class=\"nv\">off</span> <span class=\"cp\">%}</span>\n    This will not be auto-escaped: <span class=\"cp\">{{</span> <span class=\"nv\">data</span> <span class=\"cp\">}}</span>.\n\n    Nor this: <span class=\"cp\">{{</span> <span class=\"nv\">other_data</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">autoescape</span> <span class=\"nv\">on</span> <span class=\"cp\">%}</span>\n        Auto-escaping applies again: <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endautoescape</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endautoescape</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>The auto-escaping tag passes its effect onto templates that extend the\ncurrent one as well as templates included via the <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-include\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">include</span></code></a> tag,\njust like all block tags. For example:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\">base.html</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">autoescape</span> <span class=\"nv\">off</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endautoescape</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\">child.html</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>This <span class=\"ni\">&amp;amp;</span> that<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{{</span> <span class=\"nv\">greeting</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<p>由于自动转义在base模板中被关闭了, 所以在子模板中他也是被关闭了的, 导致了在呈现HTML时, <code class=\"docutils literal notranslate\"><span class=\"pre\">greeting</span></code> 变量被输出为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;b&gt;Hello!&lt;/b&gt;</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>This <span class=\"ni\">&amp;amp;</span> that<span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>Hello!<span class=\"p\">&lt;/</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"notes\">\n<h3>注意<a class=\"heading-anchor\" href=\"#notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>一般情况下, 模板的开发者并不需要对自动转义太过关注. 这是编写Python的开发者 (写视图和写自定义模板标签的人) 需要考虑的事. 所以, 你只需要做和模板有关的活.</p>\n<p>如果你不确定模板在何时会进行自动转义(或不进行), 那么就向所有需要转义的变量添加 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-escape\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">escape</span></code></a> 过滤器. 当自动转义被打开, 这么做不会有任何问题, <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-escape\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">escape</span></code></a> 过滤器不会再次转义 -- <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-escape\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">escape</span></code></a> 过滤器不会影响自动转义的变量.</p>\n</section>\n<section id=\"string-literals-and-automatic-escaping\">\n<span id=\"id3\"></span><h3>字符串和自动转义<a class=\"heading-anchor\" href=\"#string-literals-and-automatic-escaping\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>正如我们前面提到的, 过滤器参数可以是字符串:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">data</span><span class=\"o\">|</span><span class=\"nf\">default</span><span class=\"s2\">:&quot;This is a string literal.&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>这些作为过滤器参数的字符串 <strong>都不经过</strong> 自动转义, 他们是被认为经过了 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatefilter-safe\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">safe</span></code></a> 过滤器的. 这么做的原因是, 模板的开发者是在控制字符的输出, 所以他们能确保正确的使用转义后的HTML字面值.</p>\n<p>这意味着你应当这么写</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">data</span><span class=\"o\">|</span><span class=\"nf\">default</span><span class=\"s2\">:&quot;3 &amp;lt; 2&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>...rather than:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">data</span><span class=\"o\">|</span><span class=\"nf\">default</span><span class=\"s2\">:&quot;3 &lt; 2&quot;</span> <span class=\"cp\">}}</span>  <span class=\"c\">{# Bad! Don&#39;t do this. #}</span>\n</code></pre></div>\n<p>这不会影响来自变量本身的数据. 如果必要, 变量本身仍会被自动转义, 因为他们无法控制的模板作者.</p>\n</section>\n</section>\n<section id=\"accessing-method-calls\">\n<span id=\"template-accessing-methods\"></span><h2>访问方法调用<a class=\"heading-anchor\" href=\"#accessing-method-calls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>大多附加到对象上的方法都可以在模板中被调用.这意味着模板可以从视图中传递过来变量中获得对象属性之外的值.例如, Django ORM 提供了 <a class=\"reference internal\" href=\"/zh-hans/2.2/topics/db/queries/#topics-db-queries-related\"><span class=\"std std-ref\">&quot;entry_set&quot;</span></a> 语法寻找一个外键所关联的对象的集合. 因此, 架设一个叫 &quot;comment&quot; 的模型有外键指向了模型 &quot;task&quot;,你可以通过给定一个实际的 task , 像这样循环输出它所有的 comment:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">comment</span> <span class=\"k\">in</span> <span class=\"nv\">task.comment_set.all</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">comment</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>同样, <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/models/querysets/\"><span class=\"doc\">QuerySets</span></a> 提供了一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> 方法来统计它所包含的对象数目. 因此, 您可以得到当前 task 相关的所有 comment 的数目:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">task.comment_set.all.count</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>And of course you can easily access methods you've explicitly defined on your\nown models:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">models.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Task</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">foo</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;bar&quot;</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\">template.html</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">task.foo</span> <span class=\"cp\">}}</span>\n</code></pre></figure>\n<p>由于Django有意限制了模板中语言逻辑的处理, 所以不能在模板内调用方法时传递参数. 数据应当在视图中计算, 然后再传递给模板.</p>\n</section>\n<section id=\"custom-tag-and-filter-libraries\">\n<span id=\"loading-custom-template-libraries\"></span><h2>自定义标签和过滤器库<a class=\"heading-anchor\" href=\"#custom-tag-and-filter-libraries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Certain applications provide custom tag and filter libraries. To access them in\na template, ensure the application is in <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> (we'd add\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.humanize'</span></code> for this example), and then use the <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">load</span></code></a>\ntag in a template:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">humanize</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{{</span> <span class=\"m\">45000</span><span class=\"o\">|</span><span class=\"nf\">intcomma</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>In the above, the <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">load</span></code></a> tag loads the <code class=\"docutils literal notranslate\"><span class=\"pre\">humanize</span></code> tag library, which then\nmakes the <code class=\"docutils literal notranslate\"><span class=\"pre\">intcomma</span></code> filter available for use. If you've enabled\n<a class=\"reference internal\" href=\"/zh-hans/2.2/ref/contrib/admin/admindocs/#module-django.contrib.admindocs\" title=\"django.contrib.admindocs: Django's admin documentation generator.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.admindocs</span></code></a>, you can consult the documentation area in your\nadmin to find the list of custom libraries in your installation.</p>\n<p>The <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">load</span></code></a> tag can take multiple library names, separated by spaces.\nExample:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">humanize</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>请参考 <a class=\"reference internal\" href=\"/zh-hans/2.2/howto/custom-template-tags/\"><span class=\"doc\">自定义模板（template）的标签（tags）和过滤器（filters）</span></a> 以获得更多的有关自定义标签的内容.</p>\n<section id=\"custom-libraries-and-template-inheritance\">\n<h3>自定义库和模板继承<a class=\"heading-anchor\" href=\"#custom-libraries-and-template-inheritance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>当你加载一个自定义标签和过滤器库, 这些被加载的标签/过滤器只能在当前模板中使用 -- 其他与此模板有继承关系的(父/子)模板均不能使用这些标签/过滤器.</p>\n<p>For example, if a template <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.html</span></code> has <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">humanize</span> <span class=\"pre\">%}</span></code>, a child\ntemplate (e.g., one that has <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">&quot;foo.html&quot;</span> <span class=\"pre\">%}</span></code>) will <em>not</em> have\naccess to the humanize template tags and filters. The child template is\nresponsible for its own <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">humanize</span> <span class=\"pre\">%}</span></code>.</p>\n<p>这是因为这能使模板更健全且更好维护.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<dl class=\"simple\">\n<dt><a class=\"reference internal\" href=\"/zh-hans/2.2/ref/templates/\"><span class=\"doc\">The Templates Reference</span></a></dt><dd><p>Covers built-in tags, built-in filters, using an alternative template,\nlanguage, and more.</p>\n</dd>\n</dl>\n</aside>\n</section>\n</section>","rootId":"the-django-template-language","toc":[{"title":"模板","anchor":"templates","children":[]},{"title":"变量","anchor":"variables","children":[]},{"title":"过滤器","anchor":"filters","children":[]},{"title":"标签(Tags)","anchor":"tags","children":[]},{"title":"注释(Comments)","anchor":"comments","children":[]},{"title":"模板继承","anchor":"template-inheritance","children":[]},{"title":"自动HTML转义","anchor":"automatic-html-escaping","children":[{"title":"如何关闭它","anchor":"how-to-turn-it-off","children":[{"title":"对于单个变量","anchor":"for-individual-variables","children":[]},{"title":"对于模板文本块","anchor":"for-template-blocks","children":[]}]},{"title":"注意","anchor":"notes","children":[]},{"title":"字符串和自动转义","anchor":"string-literals-and-automatic-escaping","children":[]}]},{"title":"访问方法调用","anchor":"accessing-method-calls","children":[]},{"title":"自定义标签和过滤器库","anchor":"custom-tag-and-filter-libraries","children":[{"title":"自定义库和模板继承","anchor":"custom-libraries-and-template-inheritance","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API参考","url":"/zh-hans/2.2/ref/"},{"docname":"ref/templates/index","title":"模板","url":"/zh-hans/2.2/ref/templates/"}],"prev":{"docname":"ref/templates/index","title":"模板","url":"/zh-hans/2.2/ref/templates/"},"next":{"docname":"ref/templates/builtins","title":"Built-in template tags and filters","url":"/zh-hans/2.2/ref/templates/builtins/"},"formats":{"html":"/zh-hans/2.2/ref/templates/language/","markdown":"/zh-hans/2.2/ref/templates/language.md","json":"/zh-hans/2.2/ref/templates/language.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/ref/templates/language.txt","official":"https://docs.djangoproject.com/zh-hans/2.2/ref/templates/language/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}