Django 是否为第三方应用程序模板标记重命名/添加前缀?
是否可以添加前缀或重命名第三方应用程序模板标记 说明: 我们在项目中使用了Django 是否为第三方应用程序模板标记重命名/添加前缀?,django,django-templates,django-apps,django-template-filters,templatetags,Django,Django Templates,Django Apps,Django Template Filters,Templatetags,是否可以添加前缀或重命名第三方应用程序模板标记 说明: 我们在项目中使用了django_表2。为了提高性能,我们决定从django_表2迁移到django_数据表() 我们希望对几个表使用django_表2,并将其余的表迁移到django_数据表中 问题在于django_table 2和django_datatable使用相同的模板标记{%render_table%}。当我们深入研究时,可能会有更多的问题。我认为最简单的方法是将代码拆分为多个模板(可能包括),这样您就不会在同一个文件中同时包含{
django_表2
。为了提高性能,我们决定从django_表2
迁移到django_数据表
()
我们希望对几个表使用django_表2
,并将其余的表迁移到django_数据表中
问题在于django_table 2
和django_datatable
使用相同的模板标记{%render_table%}
。当我们深入研究时,可能会有更多的问题。我认为最简单的方法是将代码拆分为多个模板(可能包括),这样您就不会在同一个文件中同时包含{%load django_tables%}
和{%load table_tags%}
(来自django datatable)。这不需要任何花哨的东西,可以与任何Django版本一起使用
至于重命名,我认为没有现成的内置方法。有一种语法可以只导入特定的标记/过滤器({%load render\u table from table\u tags%}
),但无法重命名它们
一种方法是实现自定义加载程序。您可能应该看看源代码,并复制它,使用自定义的{%load\u ex render\u table as render\u table\u dt from table\u tags%}
语法实现您自己的load\u ex
。基本上,您所要做的就是根据提供的规则添加扩展语法解析和重命名lib.tags
键(这只是一个dict,从标记名映射到函数)
或者——一种更脏的方法——勾入。在这里,您有库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
这应该足以重命名标记。我根本没有测试过代码(如果有任何打字错误或一些错误,很抱歉),但是你应该明白了。我相信最简单的方法就是将代码拆分为多个模板(可能包括),这样你就不会同时拥有{%load django_tables%}
和{%load table_tags%}
(来自django datatable)在同一个文件中。这不需要任何花哨的东西,可以与任何Django版本一起使用
至于重命名,我认为没有现成的内置方法。有一种语法可以只导入特定的标记/过滤器({%load render\u table from table\u tags%}
),但无法重命名它们
一种方法是实现自定义加载程序。您可能应该看看源代码,并复制它,使用自定义的{%load\u ex render\u table as render\u table\u dt from table\u tags%}
语法实现您自己的load\u ex
。基本上,您所要做的就是根据提供的规则添加扩展语法解析和重命名lib.tags
键(这只是一个dict,从标记名映射到函数)
或者——一种更脏的方法——勾入。在这里,您有库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()
中,您可以使用其他名称重新注册标记:
from table.templatetags.table_tags import register, render_table
register.tag('datatable_render_table', render_table)
您应该将它放在启动期间执行的某个位置,例如在AppConfig.ready()
中,这是一个非常好的解决方案。只需补充一点,在django_tables标记之前加载datatable标记是必要的,因为render_table标记不是未注册的。这是一个非常好的解决方案。只需添加一点,在django_tables标记之前加载datatable标记是必要的,因为render_table标记未被注销。