我想在同一个django模板中使用相同的{%block%}两次.我希望此块在我的基本模板中出现多次:
# base.html{% block title %}My Cool Website{% endblock %} {% block title %}My Cool Website{% endblock %}
然后扩展它:
# blog.html {% extends 'base.html' %} {% block title %}My Blog{% endblock %} # pictures.html {% extends 'base.html' %} {% block title %}My Pictures{% endblock %} # cats.html {% extends 'base.html' %} {% block title %}My Cats{% endblock %}
我会得到一个例外,因为Django希望块只出现一次:
在/的TemplateSyntaxError
名称为"title"的'block'标记不止一次出现
一个快速而肮脏的解决方案是将块标题复制到title1和title2:
# blog.html {% extends 'base.html' %} {% block title1 %}My Blog{% endblock %} {% block title2 %}My Blog{% endblock %}
但这违反了DRY原则.这将是非常困难的,因为我有很多继承模板,也因为我不想下地狱;-)
这个问题有什么技巧或解决方法吗?如何在模板中重复相同的块,而不重复所有代码?
使用Django模板宏插件:
http://www.djangosnippets.org/snippets/363/(django <1.4)
要么
https://gist.github.com/1715202 (django> = 1.4)
然后,
# base.html {% kwacro title %} {% block title %}My Cool Website{% endblock %} {% endkwacro %}{% usekwacro title %} {% usekwacro title %}
和
# blog.html {% extends 'base.html' %} {% block title %}My Blog{% endblock %}
我认为在这种情况下使用上下文处理器是一种过度杀伤力.你可以轻松地做到这一点:
#base.html{% block title %}My Cool Website{% endblock %} {% block content %}{% endblock %}
然后:
# blog.html {% extends 'base.html' %} {% block content %}{% block title %}My Blog{% endblock %}
Lorem ipsum here... {% endblock %}
等等......看起来像DRY兼容.
您可能实际上并不想使用块而是只使用变量:
# base.html{{ title|default:"My Cool Website" }} {{ title|default:"My Cool Website" }}
然后,您可以通过上下文设置标题.
你可以使用{% include subtemplate.html %}
不止一次.它与块不同,但可以解决问题.
这是我在尝试自己做同样事情时发现的一种方式:
# base_helper.html{% block _title1 %}{% endblock %} {% block _title2 %}{% endblock %}
# base.html {% extends "base_helper.html" %} # Copy title into _title1 & _title2, using "My Cool Website" as a default. {% block _title1 %}{% block _title2 %}{% block title %}My Cool Website{% endblock %}{% endblock %}{% endblock %}
遗憾的是需要额外的文件,但不要求您从视图中传递标题.
这里有一些讨论:http : //code.djangoproject.com/ticket/4529 显然django核心团队拒绝了这张票,因为他们认为这不是一个常用的场景,但是我不同意。
为此,重复块是一种简单而干净的实现:https : //github.com/SmileyChris/django-repeatblock
模板宏是另一个,但是作者提到它未经仔细测试:http : //www.djangosnippets.org/snippets/363/
我用了repeatblock。