重命名/将前缀添加到第三方应用模板标签中



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

说明:

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

我们想将django_tables2用于几个表,然后将其余的迁移到django_datatable

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

您可以用不同的名称重新检查标签:

from table.templatetags.table_tags import register, render_table
register.tag('datatable_render_table', render_table)

您应该将其放在启动期间执行的位置,例如在AppConfig.ready()中。

我相信最简单的方法就是将代码分为多个模板(可能是,包括(,因此您不会在 {% 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键(这只是一个dict,将从标签名称映射到函数(。

或 - 一种更脏的方法 - 钩子钩到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

这应该足以重命名标签。我根本没有测试过代码(对不起,如果有任何错别字或一些错误(,但是您应该得到这个想法。

相关内容

  • 没有找到相关文章

最新更新