【问题标题】:Elegant way to namespace templates in Django在 Django 中命名空间模板的优雅方式
【发布时间】:2014-11-26 08:51:41
【问题描述】:

Django 教程建议这样组织模板:

在您刚刚创建的模板目录中,创建另一个名为 polls 的目录,并在其中创建一个名为 index.html 的文件。换句话说,您的模板应该位于 polls/templates/polls/index.html。由于 app_directories 模板加载器的工作方式如上所述,您可以在 Django 中将此模板简单地称为 polls/index.html。

教程还告诉我如果我只是将 index.html 放入民意调查/模板中会发生什么:

现在我们或许可以将模板直接放在 polls/templates 中(而不是创建另一个 polls 子目录),但这实际上是个坏主意。 Django 将选择它找到的第一个名称匹配的模板,如果您在不同的应用程序中有一个具有相同名称的模板,Django 将无法区分它们。我们需要能够将 Django 指向正确的位置,而确保这一点的最简单方法是对它们进行命名空间。也就是说,将这些模板放在另一个以应用程序本身命名的目录中。

我的假设是,只要我创建一个隔离的应用程序,它的模板也与其他应用程序隔离,没有任何子文件夹魔法。

有没有另一种命名空间的方式,所以我可以将模板称为 index.html 而无需创建重复的文件夹?

【问题讨论】:

    标签: python django templates namespaces


    【解决方案1】:

    在 Django 项目中组织模板的方式非常灵活。因此,只要您在视图中指定正确的模板名称,就没有什么可以阻止您根据需要订购模板文件。例如,您可以为投票列表使用基于类的视图,将template_name 指定为您喜欢的任何内容:

    # polls/views.py
    from django.views.generic import ListView
    from .models import Poll
    
    class PollList(ListView):
        model = Poll
        template_name = 'any/path/you/choose/any_name.html'
    

    话虽如此,创建一致的模板结构以保持代码的可维护性是很好的。我建议至少将您的页面级模板(用于返回整个 html 页面的东西)保存在具有相关应用程序名称的文件夹中,以及您包含的任何内容({% include %} 标签中包含的 sn-ps ) 在includes 子文件夹中,如下所示:

    templates
       - base.html
       polls
           - poll_list.html
           includes
               - poll_votes.html
    

    编辑:

    如果您仍然需要命名空间,您可以使用URL namespaces

    【讨论】:

    • 我可以看到这个。但是,我仍然有点担心,我需要在 Django 的 polls/templates 中创建另一个文件夹,以免将 polls index.html 与另一个应用程序的 index.html 混淆。我的假设是,只要我创建一个隔离的应用程序,它的模板也与其他应用程序隔离,没有任何子文件夹魔法。
    • 这样做的原因是,在 INSTALLED_APPS 设置中较低的应用程序可以覆盖以前的模板。例如,您可以在 admin/poll/poll_changelist.html 中创建一个模板来覆盖模型的管理界面。无论如何,我已经更新了我的答案,包括使用 url 命名空间的可能性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多