Переименовать/добавить префикс в теги шаблонов сторонних приложений?

Можно ли добавить префикс или переименовать теги шаблонов сторонних приложений?

Объяснение:

Мы используем django_tables2 в нашем проекте. В целях повышения производительности мы решили перейти с django_tables2 на django_datatable (https://github.com/shymonk/django-datatable).

Мы хотим использовать django_tables2 для пары таблиц, а остальные перенести в django_datatable.

Проблема в том, что и django_tables2, и django_datatable используют один и тот же тег шаблона {% render_table table %}. И, возможно, проблем будет больше, когда мы пойдем глубже.


person Milano    schedule 06.05.2017    source источник


Ответы (2)


Вы можете перерегистрировать тег с другим именем:

from table.templatetags.table_tags import register, render_table

register.tag('datatable_render_table', render_table)

Вы должны поместить это куда-нибудь, чтобы оно выполнялось во время запуска, например, в AppConfig.ready().

person knbk    schedule 06.05.2017
comment
Это очень хорошее решение. Просто добавьте, что необходимо загружать теги с данными перед тегами django_tables, потому что тег render_table не является незарегистрированным. - person Milano; 20.05.2017

Я считаю, что самым простым способом было бы просто разделить код на несколько шаблонов (возможно, включающих), чтобы у вас не было {% load django_tables %} и {% load table_tags %} (из django-datatable) в одном файле. Это не потребует ничего особенного и будет работать с любой версией Django.

Что касается переименования, я не думаю, что есть готовый встроенный способ. Существует синтаксис для импорта только определенных тегов/фильтров ({% load render_table from table_tags %}), но нет способа их переименовать.

Один из способов - реализовать собственный загрузчик. Вероятно, вам следует взглянуть на django.template.defaulttags.load. исходный код и скопируйте его, реализуя свой собственный load_ex с пользовательским синтаксисом {% load_ex render_table as render_table_dt from table_tags %}. По сути, все, что вам нужно сделать, это добавить расширенный анализ синтаксиса и переименовать lib.tags ключей (это просто словарь, сопоставление имени тега с функцией) в соответствии с предоставленными правилами.

Или — более грязный подход — подключиться к 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

Этого должно быть достаточно, чтобы переименовать тег. Я вообще не проверял код (извините, если есть опечатки или какие-то ошибки), но вы должны получить представление.

person drdaeman    schedule 06.05.2017