我的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
答案 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 %}