Rename/add 第三方应用模板标签的前缀?
Rename/add prefix to third party app template tags?
是否可以添加前缀或重命名第三方应用模板标签?
解释:
我们在项目中使用django_tables2
。出于性能目的,我们决定从 django_tables2
迁移到 django_datatable
(https://github.com/shymonk/django-datatable)。
我们想对几个表使用 django_tables2
,并将其余表迁移到 django_datatable
。
问题是 django_tables2
和 django_datatable
使用相同的模板标签 {% render_table table %}
。而且说不定再深入下去问题会更多。
我认为最简单的方法是将代码拆分为多个模板(可能包括),这样您就不会同时拥有 {% load django_tables %}
和 {% load table_tags %}
(来自 django-datatable)在同一个文件中。这不需要任何花哨的东西,并且适用于任何 Django 版本。
至于重命名,我认为没有现成的内置方法。有一种语法可以仅导入特定的 tags/filters ({% 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
键(它只是一个dict,从标签名称映射到函数)。
或者 - 更肮脏的方法 - 挂钩到 django.template.defaulttags.find_library
。在那里,你有库 name
和 parser
实例,所以像这样:
# 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
这应该足以重命名标签。我根本没有测试代码(如果有任何拼写错误或错误,请原谅),但你应该明白了。
您可以使用不同的名称重新注册标签:
from table.templatetags.table_tags import register, render_table
register.tag('datatable_render_table', render_table)
你应该把它放在它在启动期间执行的地方,例如 AppConfig.ready()
.
是否可以添加前缀或重命名第三方应用模板标签?
解释:
我们在项目中使用django_tables2
。出于性能目的,我们决定从 django_tables2
迁移到 django_datatable
(https://github.com/shymonk/django-datatable)。
我们想对几个表使用 django_tables2
,并将其余表迁移到 django_datatable
。
问题是 django_tables2
和 django_datatable
使用相同的模板标签 {% render_table table %}
。而且说不定再深入下去问题会更多。
我认为最简单的方法是将代码拆分为多个模板(可能包括),这样您就不会同时拥有 {% load django_tables %}
和 {% load table_tags %}
(来自 django-datatable)在同一个文件中。这不需要任何花哨的东西,并且适用于任何 Django 版本。
至于重命名,我认为没有现成的内置方法。有一种语法可以仅导入特定的 tags/filters ({% 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
键(它只是一个dict,从标签名称映射到函数)。
或者 - 更肮脏的方法 - 挂钩到 django.template.defaulttags.find_library
。在那里,你有库 name
和 parser
实例,所以像这样:
# 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
这应该足以重命名标签。我根本没有测试代码(如果有任何拼写错误或错误,请原谅),但你应该明白了。
您可以使用不同的名称重新注册标签:
from table.templatetags.table_tags import register, render_table
register.tag('datatable_render_table', render_table)
你应该把它放在它在启动期间执行的地方,例如 AppConfig.ready()
.