1

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

说明:

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

我们想用django_tables2做几个表格,并将其余的部分迁移到django_datatable

问题是django_tables2django_datatable使用相同的模板标签{% render_table table %}。当我们更深入的时候,也许会有更多的问题。

回答

2

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

from table.templatetags.table_tags import register, render_table 

register.tag('datatable_render_table', render_table) 

你应该把这个地方是执行启动过程中,例如在AppConfig.ready()

+0

这是一个非常好的解决方案。只需添加,它必须在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 

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