我知道我们可以在模板中使用“扩展变量”来在两个不同的扩展模板之间切换。例如:
views:
if something:
base = 'base1.html'
else:
base = 'base2.html'
return render_to_response ('template.html', {'base':base})
template.html:
{% extends base %}
通常情况下,这可以很好地工作。然而,我的问题是我使用的是django-registration,我不需要编写自己的视图来处理注册和登录过程。这也意味着我不能将变量传递给模板。虽然我在我的项目目录下有注册模板。(如login.html)
不幸的是,Django不能在模板中做到这一点:
{% if something %}
{% extends 'base1.html' %}
{% else %}
{% extends 'base2.html' %}
{% endif %}
我知道‘变量库’可以传递给auth-login的唯一方法是编写我自己的视图,比如login,logout,等等。这似乎不适合DRY模型,而且在以后的工作中很容易出错。
有没有其他方法可以让我做到这一点?或者有什么解决问题的建议吗?
谢谢。
-P
发布于 2011-02-26 12:01:40
老实说,在我看来,这就像是一种代码味道--我已经使用过django注册了几次,我在相当大的网站上工作,我从来不需要从另一个只在运行时才知道的模板中扩展一个模板。
无论如何,如果你真的想把一个自定义变量传递给一个由第三方模块呈现的模板,而你又不想破解那个模块,那么你就必须使用自定义template context processor。另外,django注册允许将extra_context
传递给它的视图,也许这就足够了。您也可以尝试使用猴子补丁。或者,您可以尝试操作模板文件夹或模板加载器来获得所需的内容。
但是所有这些都是IMHO的技巧,你不应该为一个视图使用不同的模板,除非它是一个通用视图。
发布于 2012-11-07 16:28:37
如果只有2个(或3个)选项可以将“某物”转换为布尔值,那么您可以使用yesno过滤器:https://docs.djangoproject.com/en/dev/ref/templates/builtins/#yesno
所以:
{% extends something|yesno:"base1.html,base2.html" %}
如果你想要一些更自由的东西,那么你可以使用上面提到的额外的上下文/自定义上下文处理器选项,并尝试如下所示:
{% extends selected_template|default:"base2.html" %}
其中,选定的模板只是您喜欢的任何基本模板的路径。
发布于 2011-02-26 10:26:26
我认为你不应该把不同模板之间的差异放在不同基础模板的选择中。拥有不同的基础模板是违反DRY原则的。将常见的东西放入一个模板中,即。包含,与您通过‘registration.html’调用的其他模板的区别:
{%extends base.html%}
{%if something%}
{%include "type1.html"%}
{%else%}
{%include "type2.hmtl"%}
其中模板名称与您在视图定义中使用的名称相同。
https://stackoverflow.com/questions/5126033
复制