为第三方应用程序模板标签重命名/添加前缀?

Posted

技术标签:

【中文标题】为第三方应用程序模板标签重命名/添加前缀?【英文标题】:Rename/add prefix to third party app template tags? 【发布时间】:2017-10-04 23:47:26 【问题描述】:

是否可以添加前缀或重命名第三方应用模板标签?

解释:

我们在项目中使用django_tables2。出于性能考虑,我们决定从 django_tables2 迁移到 django_datatable (https://github.com/shymonk/django-datatable)。

我们想对几个表使用django_tables2,并将其余表迁移到django_datatable

问题在于django_tables2django_datatable 都使用相同的模板标签% render_table table %。当我们更深入时,也许会出现更多问题。

【问题讨论】:

【参考方案1】:

您可以使用不同的名称重新注册标签:

from table.templatetags.table_tags import register, render_table

register.tag('datatable_render_table', render_table)

你应该把它放在启动时执行的地方,例如AppConfig.ready()

【讨论】:

这是一个非常好的解决方案。只是补充一下,有必要在 django_tables 标签之前加载数据表标签,因为 render_table 标签没有取消注册。【参考方案2】:

我相信最简单的方法是将代码拆分为多个模板(可能包括),这样您就不会在同一个文件中同时拥有 % load django_tables %% load table_tags %(来自 django-datatable)。这不需要任何花哨的东西,并且适用于任何 Django 版本。

至于重命名,我认为没有现成的内置方法。有一种语法可以只导入特定的标签/过滤器 (% load render_table from table_tags %),但无法重命名它们。

一种方法是实现自定义加载器。您可能应该查看django.template.defaulttags.load 源代码,然后复制它,使用自定义% load_ex render_table as render_table_dt from table_tags % 语法实现您自己的load_ex。基本上,你所要做的就是根据提供的规则添加扩展语法解析并重命名lib.tags键(它只是一个字典,从标签名映射到函数)。

或者 - 一种更肮脏的方法 - 连接到 django.template.defaulttags.find_library。在那里,你有库 nameparser 实例,所以是这样的:

# Somewhere in your project's init code...
if not hasattr(defaulttags.find_library, "_is_hacked"):
    real_find_library = defaulttags.find_library
    def find_library(parser, name):
        lib = real_find_library(parser, name)
        if name == "django_tables2" and "render_table" in lib.tags:
            lib.tags["render_table2"] = lib.tags["render_table"]
            del lib.tags["render_table"]
        return lib
    find_library._is_hacked = True
    defaulttags.find_library = find_library

这应该足以重命名标签。我根本没有测试过代码(对不起,如果有任何错别字或错误),但你应该明白了。

【讨论】:

以上是关于为第三方应用程序模板标签重命名/添加前缀?的主要内容,如果未能解决你的问题,请参考以下文章

文件重命名时快速添加时间前缀

js 如何批量重命名文件

通过添加前缀 -in R 重命名数据框的列

在 Windows 7 中使用 REN 批量重命名文件(添加前缀)

COM Interop的重命名/前缀类

重命名文件和目录(添加前缀)