首页 > 解决方案 > Django:一个包提供新模板标签的规范方法?

问题描述

我正在构建一个 Django 扩展包,我现在想在其中包含的一件事是模板标签(和过滤器)。问题是,包如何为 Django 项目提供模板标签?

上下文是已安装的软件包。假设我已经编写了一个打包的调用mypackage并使用 pip 安装它,它最终会说:

/home/me/.local/lib/python3.8/site-packages/mypackage

(pip 可以在许多不同的地方安装包,包括本地、系统、venvs 等,这只是一个例子)。

我想象在一个 Django 应用程序中,在 templatetags 目录中添加一行到两个来访问它们。就像是:

from mypackage.template import tags

说。或者如果需要实际运行一些东西来注册它们,可能作为内置标签:

https://djangosnippets.org/snippets/342/

from mypackage.template import register_tags

register_tags()

在我尝试死之前(鉴于我还找不到任何文档或示例),我很好奇是否有一个规范的方法,因为有很多 Django 扩展包。老实说,如果我能可靠地找到一个提供模板标签的标签,它当然可以作为一个例子。

感谢您提供这方面的任何提示。

标签: pythondjangodjango-templatespython-packaging

解决方案


鉴于评论中的一些亲切提示,我花了一些时间进行一些实验,并且可以确认做我希望的事情确实非常简单。这就是所有需要的:

  1. 包必须有一个templatetags文件夹。在引用的示例中,这将是:
    • /home/me/.local/lib/python3.8/site-packages/mypackage/templatetags
  2. 该文件夹必须有一个注册标签的文件,在引用的示例中可能:
    • /home/me/.local/lib/python3.8/site-packages/mypackage/templatetags/newtags.py
  3. 该包必须作为应用程序包含在 settings.py 中,例如:
    • INSTALLED_APPS = ('mypackage', ...
  4. 现在可以通过引用注册模板的文件将其标签加载到任何模板中,在引用的示例中:
    • {% load newtags %}

任何包都提供标签就是这么简单,需要注意的问题是我没有找到很好的文档:

  1. 注册标签的文件名(newtags.py在引用的实例中)必须是唯一的(不与加载这些标签的应用程序中的名称冲突)。在这种情况下,它似乎降落在一个具有该名称的名称空间newtags中,如果它已经在名称空间中,则一个或另一个胜出(不确定哪个没有进行广泛测试)。
  2. 不需要进一步的配置,包根本不需要应用程序配置,也没有 Django 对我们强加的进一步要求(在版本 3 中),我们确实这样做了,只需将包添加到 INSTALLED_APPS 并给它一个 templatetags 目录,我们在其中放置一个注册我们的标签的文件,它真的很简单。

推荐阅读