Hbf*_*Hbf 20 django templates django-templates jinja2
Django创建可重用模板的方法是什么?
示例:假设我的很多页面都包含"最新消息"框并遵循DRY原则,我想定义一次并在其他页面中重复使用它.我如何使用Django(或Jinja2)模板执行此操作?
阅读Django的模板文档我得到的结论是Django模板提供了"自上而下"的继承,其中子模板本身决定了它将嵌入哪个超模板:
<!-- Super-template (not valid, for illustration): -->
<html>
<head><title>Title</title></head>
<body>{% block content %}{% endblock %}</body>
</html>
Run Code Online (Sandbox Code Playgroud)
<!-- Sub-template: -->
{% extends "base.html" %}
{% block content %}
<div class="latest-news">News</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
那么在几个地方重用块(子模板)的技术是什么?
Tob*_*obu 27
重用模板片段最灵活的方法是定义inclusion_tag.您可以将参数传递给自定义标记,在Python中处理它们,然后退回到模板.直接包含仅适用于不依赖于周围环境的片段.
来自文档的快速示例:
在app/templatetags/poll_extras.py注册带有装饰的标签:
from django import template
register = template.Library()
@register.inclusion_tag('results.html')
def show_results(poll):
choices = poll.choice_set.all()
return {'choices': choices}
Run Code Online (Sandbox Code Playgroud)
在app/templates/results.html:
<ul>
{% for choice in choices %}
<li> {{ choice }} </li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)
调用标签:
{% load poll_extras %}
{% show_results poll %}
Run Code Online (Sandbox Code Playgroud)
Chr*_*att 10
如果您需要使用,{% block %}您只能通过该{% extend %}方法来实现.否则,您可以使用{% include 'some.html' %}在多个位置包含一些HTML.