1

我明白,我们可以使用模板两个不同的扩展模板之间切换“延伸变量”。 例如Django的扩展不同的基本模板

views: 
    if something: 
     base = 'base1.html' 
    else: 
     base = 'base2.html' 
    return render_to_response ('template.html', {'base':base}) 

    template.html: 
    {% extends base %} 

通常情况下,工作正常。但是,我的问题是,我使用的是django注册,我不必编写自己的视图来处理注册和登录过程。这也意味着我无法将变量传递给模板。虽然我的项目目录下有注册模板。 (喜欢的login.html)

不幸的是,Django的不能在模板中做到这一点:

{% if something %} 
    {% extends 'base1.html' %} 
    {% else %} 
    {% extends 'base2.html' %} 
    {% endif %} 

我知道了“可变基数”可以向下传递到身份验证登录的唯一方法是写我自己的意见,如登录,注销等。这似乎不适合DRY模型,并且相当容易出错。

有没有办法,我能做到这一点的另一种方式?或者解决问题的任何指针?

谢谢。

-P

回答

4

说实话这在我看来就像一个代码味道 - 我使用的Django注册了几次,我的工作相当大的网站,我从来不需要从其他模板,仅在运行称为扩展模板时间。

无论如何,如果你真的想自定义变量传递到由第三方模块呈现模板,你不要想破解这个模块,那么你必须使用例如定制template context processor。此外,django注册允许extra_context传递给它的意见,也许这就够了。你也可以尝试猴子补丁。或者,也许你可以尝试操纵模板文件夹或模板加载器来获得你所需要的。

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

+1

Tomasz,你是正确的,这是更多的编码问题。发布这个问题后,我挖了一点。我需要切换基本模板的原因是我有两个不同版本的网站 - 完整版和移动版。由于超过1/2的网站将永远不会移动到移动网站,因此我开始使用中间件来切换视图。要真正解决我的问题,我相信我将不得不添加方法来重新路由我的移动GET请求。我只是因为懒惰才希望避免这种情况。感谢帖子!感谢您的时间。 – pdxMobile 2011-02-26 18:34:21

1

这可能不是你在找什么,但你可以只包括你的条件语句中的base.html文件?

+0

你应该把这种东西的评论,而不是作为答复.. – bx2 2011-02-26 12:35:07

+0

只有1声望,我无法创建评论。我会牢记这一点。谢谢。 – DTing 2011-03-03 04:26:31

1

我想你不应该把模板之间的差异为不同的基本模板的选择。拥有不同的基本模板违反了DRY原则。将常见的东西放在模板中,即。 registration.html,您通过拨打差异考虑其他模板“包括”:

{%extends base.html%} 

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

在模板名称是一样的,你会在视图定义中使用。

3

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

选择的模板只是您喜欢的任何基础模板的路径。