python - 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 扩展包。老实说,如果我能可靠地找到一个提供模板标签的标签,它当然可以作为一个例子。
感谢您提供这方面的任何提示。
解决方案
鉴于评论中的一些亲切提示,我花了一些时间进行一些实验,并且可以确认做我希望的事情确实非常简单。这就是所有需要的:
- 包必须有一个
templatetags
文件夹。在引用的示例中,这将是:/home/me/.local/lib/python3.8/site-packages/mypackage/templatetags
- 该文件夹必须有一个注册标签的文件,在引用的示例中可能:
/home/me/.local/lib/python3.8/site-packages/mypackage/templatetags/newtags.py
- 该包必须作为应用程序包含在 settings.py 中,例如:
INSTALLED_APPS = ('mypackage', ...
- 现在可以通过引用注册模板的文件将其标签加载到任何模板中,在引用的示例中:
{% load newtags %}
任何包都提供标签就是这么简单,需要注意的问题是我没有找到很好的文档:
- 注册标签的文件名(
newtags.py
在引用的实例中)必须是唯一的(不与加载这些标签的应用程序中的名称冲突)。在这种情况下,它似乎降落在一个具有该名称的名称空间newtags
中,如果它已经在名称空间中,则一个或另一个胜出(不确定哪个没有进行广泛测试)。 - 不需要进一步的配置,包根本不需要应用程序配置,也没有 Django 对我们强加的进一步要求(在版本 3 中),我们确实这样做了,只需将包添加到 INSTALLED_APPS 并给它一个 templatetags 目录,我们在其中放置一个注册我们的标签的文件,它真的很简单。
推荐阅读
- docker - 在 GitLabCI 管道中构建 docker 镜像
- excel - 高于指定值的所有行的 VBA 公式
- laravel-5 - 访问存储在 Amazon S3 中的图像时出错
- python - 如何从该站点获取图像?
- kubernetes - 从远程客户端访问 kubernetes web ui
- websphere - 将决策服务器配置为使用 WAS 8.5.5 JDK 1.7_64 的独立配置文件 IBM ODM 8.9.2 时出错
- mongodb - 如何在 Mongodb 中找到没有 _id 的单个值?
- sql - 如何使用触发器根据日期更改列值?
- facebook - 如何使用 Facebook 的开放图形标签“product.group”?
- python - IDLE 识别的错误 python 安装/或 IDLE 不识别 Anaconda