Отображение значений выбора в Django: 'Male' вместо 'M'

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы отобразить подписи в выборочном поле Django используйте метод get_FOO_display(). Так, если у модели Person есть поле gender, то вы можете получить подпись именно этого значения следующим образом:

Python
Скопировать код
display_value = Person.objects.get(id=1).get_gender_display()
print(display_value)  # Результат будет либо "Мужской", либо "Женский" в зависимости от содержимого поля
Кинга Идем в IT: пошаговый план для смены профессии

Применение get_FOO_display() в шаблонах

Когда работаете со шаблонами Django, помните, что вызов метода выполняется без использования круглых скобок:

django
Скопировать код
{{ person.get_gender_display }}

Если подписи вдруг не отображаются, проверьте, корректно ли применен фильтр to_be_listed в вашем представлении:

Python
Скопировать код
persons = Person.objects.filter(to_be_listed=True)

Теперь список persons будет содержать только те объекты модели, которые вам нужны.

Определение и работа с перечислениями

При определении перечислений в модели используйте кортежи. Вот как будет выглядеть определение списка полов для модели Person:

Python
Скопировать код
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 представляет читаемое имя для значений из перечислений:

Python
Скопировать код
CHOICES = (
    ('F', 'Первокурсник'),
    ('S', 'Второкурсник'),
)

# Хочется ощутить "вкус" второго курса?
get_display = dict(CHOICES).get('S', 'Неизвестно')
Markdown
Скопировать код
Вы указываете код:      ['S']
А получаете в итоге:   ['Второкурсник']

Это похоже на заказ напитка в кафе по номеру ('S'), а на самом деле вы получаете обжигающий глоток кофе ('Второкурсник'). 🍔

Не забудьте выразить благодарность вашему официанту (серверу базы данных 🖥️) за то, что он принес вам горячий кофе (интерфейс пользователя 👁️).

Управление в сложных сценариях

Когда перечисления изменчивы

Иногда перечисления могут быть динамичными или изменяются со временем. В таких случаях уместно переопределить метод save или использовать сигналы для того, чтобы синхронизировать изменения с Django.

Многоязычность

Если вы поддерживаете несколько языков, используйте функции ugettext_lazy или gettext_lazy, чтобы подписи корректно отображались в зависимости от языковых настроек пользователя.

Рефакторинг перечислений в модели

При использовании одного и того же набора значений в разных местах модели, следуйте принципу DRY. Разместите общее определение CHOICES в отдельном модуле, например, в constants.py.

Полезные материалы

  1. Справочник по полям модели | Документация Django | Django — официальная документация Django, где описываются типы полей моделей с возможностью выбора значений.
  2. Справочник по экземплярам модели | Документация Django | Django — материал о том, как получить доступ к подписям значений полей с выбираемыми вариантами.
  3. Модели | Документация Django | Django — необходимая документация по моделям Django, которая поможет понять структуру перечислений.
  4. Инспектор классов представлений Django — Classy CBVотличный инструмент для исследования классовых представлений в Django.
  5. Поля форм | Документация Django | Djangoруководство по полям форм Django, в частности о поле ChoiceField, для корректного обработки значений из перечислений в формах.