Django: DRY и названия полей моделей в шаблонах
Если вы знакомы с Django, то, возможно, задумывались о том, как принцип «не повторяйся» (DRY) соотносится с тем, что в этом каркасе нет способа «из коробки», чтобы получить человекопонятное имя поля модели в шаблоне. Заметка как раз об этом.
И верно: не к лицу каркасу, пропагандирующему в документации принцип «не повторяйся» подталкивать своих пользователей к его нарушению.
Если приглядеться, то в шаблонах с детальной информацией о сущности (да и в списочных) зачастую требуется получить имя (verbose_name) поля модели, и нет ничего противоестественного в том, чтобы использовать уже имеющиеся в данные, а не копировать их по шаблонам, однако, инструментов в наборе Django для этого действительно не предусмотрено.
Сегодня я попытался исправить этот недостаток, добавив пару новых шаблонных тегов в набор приложения django-etc, и вот что из этого получилось:
Всё просто: достаточно передать тегу модель и имя поля, чтобы получить человекопонятное имя. Помимо тега
Обратите внимание, что в переменной my_model может находиться не только модель, но и их гомогенный набор (например, представленный QuerySet или Page объектом). Эту особенность вкупе с директивой as (позволяющей поместить результат исполнения тега в переменную контекста шаблона для последующего использования) упомянутых тегов можно употреблять в списочных шаблонах, чтобы получить имена полей единожды:
Помимо этого, django-etc в поддержку принципа DRY располагает ещё двумя шаблонными тегами:
Теперь, если вы поменяете имена в моделях, вам не придётся заменять их ещё и в шаблонах.
Не повторяйтесь.
Удачи!
Если приглядеться, то в шаблонах с детальной информацией о сущности (да и в списочных) зачастую требуется получить имя (verbose_name) поля модели, и нет ничего противоестественного в том, чтобы использовать уже имеющиеся в данные, а не копировать их по шаблонам, однако, инструментов в наборе Django для этого действительно не предусмотрено.
Сегодня я попытался исправить этот недостаток, добавив пару новых шаблонных тегов в набор приложения django-etc, и вот что из этого получилось:
{% load model_field %} <!-- Подгружаем библиотеку тегов. -->
<!-- Выводим имя поля модели и значение. -->
{% model_field_verbose_name from my_model.fieldname %}:
{{ my_model.fieldname }}
Всё просто: достаточно передать тегу модель и имя поля, чтобы получить человекопонятное имя. Помимо тега
model_field_verbose_name
существует также model_field_help_text
, возвращающий, как нетрудно догадаться, текст подсказки для поля.Обратите внимание, что в переменной my_model может находиться не только модель, но и их гомогенный набор (например, представленный QuerySet или Page объектом). Эту особенность вкупе с директивой as (позволяющей поместить результат исполнения тега в переменную контекста шаблона для последующего использования) упомянутых тегов можно употреблять в списочных шаблонах, чтобы получить имена полей единожды:
{% model_field_verbose_name from my_models_set.fieldname as title_fieldname %}
{{ title_fieldname }}
Помимо этого, django-etc в поддержку принципа DRY располагает ещё двумя шаблонными тегами:
model_meta_verbose_name
и model_meta_verbose_name_plural
позволяют получить человекопонятные имена моделей в единственном и множественном числах соответственно: {% load model_meta %}
{% model_meta_verbose_name my_model %}
Теперь, если вы поменяете имена в моделях, вам не придётся заменять их ещё и в шаблонах.
Не повторяйтесь.
Удачи!
На заметку
У нас есть представительство во ВКонтакте. Ссылка в самом низу страницы.