django扩展了不同的基本模板

时间:2011-02-26 09:10:38

标签: django django-templates django-authentication django-registration

据我所知,我们可以在模板中使用“extends variable”来切换两个不同的扩展模板。 e.g。

  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的唯一方法是编写自己的视图,如登录,注销等。这似乎不适合DRY模型,并且相当容易出错。

还有其他方法可以实现这一目标吗?或任何解决问题的指针?

感谢。

-P

4 个答案:

答案 0 :(得分:4)

说实话,这对我来说就像一个代码味道 - 我已经使用了django-registration几次,我在相当大的网站上工作,我从来不需要从另一个模板扩展模板,这只是在运行时才知道

无论如何,如果你真的想将自定义变量传递给第三方模块呈现的模板,并且你不想破解该模块,那么你必须使用例如自定义template context processor。此外,django-registration允许extra_context传递给它的视图,也许这就足够了。你也可以尝试猴子修补。或者您可以尝试操作模板文件夹或模板加载器以获得所需的内容。

但是所有这些都是恕我直言,你不应该为一个视图使用不同的模板,除非它是一般视图。

答案 1 :(得分:4)

如果只有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" %}

其中所选模板只是您喜欢的任何基本模板的路径。

答案 2 :(得分:1)

这可能不是您想要的,但您可以在base.html中包含您的条件吗?

答案 3 :(得分:1)

我认为您不应将模板之间的差异放入不同基本模板的选择中。拥有不同的基本模板违反了DRY原则。将常见事物放入模板中,即。 registration.html,与您通过'include'调用的其他模板的差异:

{%extends base.html%}

{%if something%}
    {%include "type1.html"%}
{%else%}
    {%include "type2.hmtl"%}  

其中模板名称与您在视图定义中使用的名称相同。