Отображение значений выбора в Django: 'Male' вместо 'M'
Быстрый ответ
Чтобы отобразить подписи в выборочном поле Django используйте метод get_FOO_display()
. Так, если у модели Person
есть поле gender
, то вы можете получить подпись именно этого значения следующим образом:
display_value = Person.objects.get(id=1).get_gender_display()
print(display_value) # Результат будет либо "Мужской", либо "Женский" в зависимости от содержимого поля
Применение get_FOO_display()
в шаблонах
Когда работаете со шаблонами Django, помните, что вызов метода выполняется без использования круглых скобок:
{{ person.get_gender_display }}
Если подписи вдруг не отображаются, проверьте, корректно ли применен фильтр to_be_listed
в вашем представлении:
persons = Person.objects.filter(to_be_listed=True)
Теперь список persons
будет содержать только те объекты модели, которые вам нужны.
Определение и работа с перечислениями
При определении перечислений в модели используйте кортежи. Вот как будет выглядеть определение списка полов для модели Person
:
class Person(models.Model):
GENDER_CHOICES = (
('M', 'Мужской'),
('F', 'Женский'),
('O', 'Другое'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
to_be_listed = models.BooleanField(default=False)
# Благодаря `get_FOO_display()` в Django не требуется определить свой метод для этих целей.
# Это могло показаться неосуществимым, но Django сделал это возможным! 🎉
Для отображения читаемых значений поля в шаблонах достаточно вызвать метод get_gender_display
, не добавляя круглые скобки. В других случаях можно преобразовать перечисление в словарь с помощью выражения dict(YOUR_CHOICES)
.
Ценные рекомендации (прекрасные практики)
Соблюдайте принцип DRY
Следуйте золотому правилу: Определите перечисления один раз и используйте их везде, где это нужно. Это поможет избежать несоответствий, а ваш код станет чище и более понятным.
Не творите излишний код
Используйте встроенную возможность Django get_FOO_display()
, а не изобретайте велосипед заново. Не создавайте свой метод, если уже доступно подходящее встроенное решение. Это аналогично попытке досягнуть печенья, построив лестницу, когда достаточно просто воспользоваться присутствующей на столе банкой.
Фильтрация и отображение
Всегда полезно фильтровать объекты, для которых установлено to_be_listed=True
, прежде чем обращаться к get_FOO_display()
. Это поможет избавиться от нежелательных объектов.
Визуализация
Пример того, как Django представляет читаемое имя для значений из перечислений:
CHOICES = (
('F', 'Первокурсник'),
('S', 'Второкурсник'),
)
# Хочется ощутить "вкус" второго курса?
get_display = dict(CHOICES).get('S', 'Неизвестно')
Вы указываете код: ['S']
А получаете в итоге: ['Второкурсник']
Это похоже на заказ напитка в кафе по номеру ('S'
), а на самом деле вы получаете обжигающий глоток кофе ('Второкурсник'
). 🍔
Не забудьте выразить благодарность вашему официанту (серверу базы данных 🖥️) за то, что он принес вам горячий кофе (интерфейс пользователя 👁️).
Управление в сложных сценариях
Когда перечисления изменчивы
Иногда перечисления могут быть динамичными или изменяются со временем. В таких случаях уместно переопределить метод save
или использовать сигналы для того, чтобы синхронизировать изменения с Django.
Многоязычность
Если вы поддерживаете несколько языков, используйте функции ugettext_lazy
или gettext_lazy
, чтобы подписи корректно отображались в зависимости от языковых настроек пользователя.
Рефакторинг перечислений в модели
При использовании одного и того же набора значений в разных местах модели, следуйте принципу DRY. Разместите общее определение CHOICES
в отдельном модуле, например, в constants.py
.
Полезные материалы
- Справочник по полям модели | Документация Django | Django — официальная документация Django, где описываются типы полей моделей с возможностью выбора значений.
- Справочник по экземплярам модели | Документация Django | Django — материал о том, как получить доступ к подписям значений полей с выбираемыми вариантами.
- Модели | Документация Django | Django — необходимая документация по моделям Django, которая поможет понять структуру перечислений.
- Инспектор классов представлений Django — Classy CBV — отличный инструмент для исследования классовых представлений в Django.
- Поля форм | Документация Django | Django — руководство по полям форм Django, в частности о поле
ChoiceField
, для корректного обработки значений из перечислений в формах.