如何在Django中创建可重用的模板?

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)


jvc*_*c26 12

您正在寻找的是{% include "template.html"%}来自Django docs.


Chr*_*att 10

如果您需要使用,{% block %}您只能通过该{% extend %}方法来实现.否则,您可以使用{% include 'some.html' %}在多个位置包含一些HTML.