Если вы знакомы с Django, то, возможно, задумывались о том, как принцип «не повторяйся» (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 %}

Теперь, если вы поменяете имена в моделях, вам не придётся заменять их ещё и в шаблонах.

Не повторяйтесь.
Удачи!

Категории

Язык
Окружение
Область
Проект

На заметку
У нас есть представительство во ВКонтакте. Ссылка в самом низу страницы.