1

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

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

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

4

2 回答 2

1

为此,您可以利用模板继承{% 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.

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

于 2013-09-14T17:28:29.033 回答
1

这正是我创建django_layers的原因

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

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

这些软件包相对较新,让我知道它是否适合您,或者如果您决定使用它是否有问题。

于 2013-09-16T09:06:07.287 回答