对于我的应用程序,我想为访问者和管理员提供不同的base.html(以及其他模板和静态文件):访问者将看到自定义的主题前端,管理员将看到编辑器界面(与django admin无关)接口)。一些模板/资源将在两个前端之间共享。
我知道我可以通过单独的settings.py配置来实现这一点,并通过django应用程序在每个配置中包含不同的模板路径,但这也意味着我必须运行该应用程序的两个实例。我宁愿为单个实例(或工作池)提供前端服务。
有没有办法动态添加额外的文件夹到Django搜索路径?这应该符合我的需求:如果用户通过访问者域名,首先搜索添加的路径,然后搜索默认值,否则只使用默认模板搜索路径。
答案 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.html
,base_site_editor.html
,base_site_admin.html
。
此方法不要求您更改任何视图,只需更改子模板,因此我认为这是最简单的方法之一。
答案 1 :(得分:1)
这正是我创建django_layers
的原因它的灵感来自Plone皮肤/图层系统,您可以在其中切换皮肤并让框架搜索模板,静态文件等不同的图层。我在Django中遗漏了类似的东西,就像你一样,我能找到的唯一选择是继承或不同的INSTALLED_APPS配置。
事实证明它也非常适合其他用例,例如A / B测试。
这些包是相对较新的,请告诉我它是否适用于您,或者如果您决定使用它,则会出现问题。