Django:包提供新模板标签的规范方法?

Django: a canconical method for a package to offer new template tags?

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

上下文是一个已安装的包。假设我写了一个名为 mypackage 的包,我用 pip 安装它,结果是:

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

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

我想象在 Django 应用程序中,在 templatetags 目录中添加一行到两个以访问它们。类似于:

from mypackage.template import tags

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

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

from mypackage.template import register_tags

register_tags()

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

如有任何这方面的提示,我们将不胜感激。

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

  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 目录,我们在其中放置一个文件来注册我们的标签,真的就是这么简单。