根据请求更改django模板搜索路径

时间:2013-09-14 16:53:19

标签: django templates

对于我的应用程序,我想为访问者和管理员提供不同的base.html(以及其他模板和静态文件):访问者将看到自定义的主题前端,管理员将看到编辑器界面(与django admin无关)接口)。一些模板/资源将在两个前端之间共享。

我知道我可以通过单独的settings.py配置来实现这一点,并通过django应用程序在每个配置中包含不同的模板路径,但这也意味着我必须运行该应用程序的两个实例。我宁愿为单个实例(或工作池)提供前端服务。

有没有办法动态添加额外的文件夹到Django搜索路径?这应该符合我的需求:如果用户通过访问者域名,首先搜索添加的路径,然后搜索默认值,否则只使用默认模板搜索路径。

2 个答案:

答案 0 :(得分:1)

您可以将template inheritance用于此目的,尤其是{% extends %}模板标记,它可以接受变量而不是文字字符串。

示例:

在您的子模板中,让他们扩展未知的基本模板,如下所示:

{% extends BASE_SITE_TEMPLATE %}

{% block page_head %}
    <!-- Custom per-page static files may be defined here -->
{% endblock %}

{% block page_content %}
    ...
{% endblock %}

然后编写一个模板上下文处理器,它将根据您的自定义条件将BASE_SITE_TEMPLATE变量传递给呈现的模板:

def base_site_template(request):
    # Here goes your conditions to select proper base template, for example
    # by checking request.user permissions or some other logic.
    ...
    return {'BASE_SITE_TEMPLATE': ...}

当然,您需要定义各种基本模板,例如base_site_user.htmlbase_site_editor.htmlbase_site_admin.html

此方法不要求您更改任何视图,只需更改子模板,因此我认为这是最简单的方法之一。

答案 1 :(得分:1)

这正是我创建django_layers

的原因

它的灵感来自Plone皮肤/图层系统,您可以在其中切换皮肤并让框架搜索模板,静态文件等不同的图层。我在Django中遗漏了类似的东西,就像你一样,我能找到的唯一选择是继承或不同的INSTALLED_APPS配置。

事实证明它也非常适合其他用例,例如A / B测试。

这些包是相对较新的,请告诉我它是否适用于您,或者如果您决定使用它,则会出现问题。

相关问题