Django模板继承 - 如何为不同的块使用相同的内容

时间:2015-02-05 08:09:41

标签: python django django-templates

我的django模板中有以下结构

我有一个theme_base.html其他模板继承自:

[...]
<title>{% block page_title_header %}{% endblock %}</title>
[...]
<h1>{% block page_title_body %}{% endblock %}</h1>

现在,大多数网页的标题和基础都有相同的 page_title,所以我需要在普通模板中执行以下操作:

{% block page_title_header %}Page title of current page{% endblock %}
{% block page_title_body %}Page title of current page{% endblock %}

这是 DRY,大多数时候我忘记更新page_title_header :(

你能推荐一种DRY方式来传递页面标题(每个页面的不同,所以我不能使用默认值)吗?

更新:在评论中进行讨论后,我相信{%with%}模板标记将是我需要使用的内容,可以执行以下操作:

{% with "Page title" as title %}
    {% block page_title_header %}{{ title }}{% endblock %}
    {% block page_title_body %}{{ title }}{% endblock %}
{% endwith %}

不幸的是,上面的无效,标题没有传递到块!!如果我删除{% block %}并执行类似

的操作
{% with "Page title" as title %}
    Title is {{ title }}
{% endwith %}

它会正常工作。你知道可能是什么问题吗? TIA

3 个答案:

答案 0 :(得分:1)

您可以在块中指定默认值,例如:

[...]
<title>{% block page_title_header %}Page title{% endblock %}</title>
[...]
<h1>{% block page_title_body %}Page title{% endblock %}</h1>

在普通模板中省略这些块时,将使用默认值。

答案 1 :(得分:1)

尝试:

<title>{% block page_title_header %}
{% if somevar_title %}
{{ somevar_title }}
{% else %}
Default title
{% endif %}
{% endblock %}</title>

并将somevar_title放在您的上下文中。在您看来:

context = {'somevar_title': Page.objects.get(pk=something).title}
return render(request, self.template_name, context)

您只需要记住在每个要使用模板的视图上为您的上下文添加标题。 您还可以使用基于类的视图更新上下文:

class MyClass(TemplateView):
    def get_context_data(self, **kwargs):
        context = super(MyClass, self).get_context_data(**kwargs)
        #get your title here...whatever you need it to be
        context['somevar_title'] = Something_to_get_my_title
        return context

然后,如果你从一个slug或某种方式获得你的标题,可以通用方式解决,只需子类MyClass,你将在上下文中有变量。例如,使用像Page.objects.get(pk=kwargs.get('page_id'))这样的东西可以解决问题(不要忘记添加逻辑来处理非有效的id)。

答案 2 :(得分:0)

使用block.super。例如:

{% block page_title %}
    {% with "foo" as title %}
        {{ block.super }}
    {% endwith %}
{% endblock %}