Django: Как получить доступ к отображаемому значению ChoiceField в шаблоне, учитывая фактическое значение и выбор?

У меня есть ChoiceField в связанной форме, выбор которой:

[('all', 'All users'), ('group', 'Selected groups'), ('none', 'None')]

В шаблоне у меня нет проблем с доступом к его связанному значению (фактическое значение, которое нужно сохранить, первый элемент каждого кортежа) и выбор. Имея эти данные в руках, я знаю, что должен иметь доступ к отображаемым значениям или ко второму элементу каждого кортежа. Но как я могу сделать это в шаблоне? Спасибо.

Ответ 1

Я сомневаюсь, что это можно сделать без специального тега шаблона или фильтра. Пользовательский шаблонный фильтр мог бы выглядеть:

@register.filter
def selected_choice(form, field_name):
    return dict(form.fields[field_name].choices)[form.data[field_name]]

Ответ 3

Отметьте эту ссылку - https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.get_FOO_display

Вы можете использовать эту функцию, которая вернет отображаемое имя - ObjectName.get_FieldName_display()

Замените ObjectName своим именем класса и полем FieldName, в поле которого вам нужно получить отображаемое имя.

Ответ 4

У меня есть контактная форма, использующая представление класса FormView. Форма контакта имеет несколько полей ChoiceField. Я не храню данные в базе данных; просто отправляя их по электронной почте владельцу сайта. Это то, что я закончил:

def form_valid(self, form):
    for field in form.fields:
        if hasattr(form[field].field, 'choices'):
            form.cleaned_data[field + '_value'] = dict(form[field].field.choices)[form.cleaned_data[field]]

    ...

Ответ 5

Если вы используете {{ form.instance.field }} в шаблоне формы, он должен отображать отображаемое имя выбранного выбора

Ответ 6

в моделях

STATUS_CHOICES = (
    (0, _("Draft")),
    (1, _("Started")),
    (2, _("Stopped")),
)

class Study(models.Model):

    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, default=0)

    @property
    def get_status(self):
        return STATUS_CHOICES[self.status][1]

в вашем шаблоне (где вы передали экземпляр модели как объект)

{{ object.get_status }}