Категории

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

19 октября 2014 г. 14:57 (ред. 19 октября 2014 г. 15:35)
Если вы знакомы с 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 %}


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

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