Джанго: Показать значение выбора

246

models.py:

class Person(models.Model):
    name = models.CharField(max_length=200)
    CATEGORY_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    gender = models.CharField(max_length=200, choices=CATEGORY_CHOICES)
    to_be_listed = models.BooleanField(default=True)
    description = models.CharField(max_length=20000, blank=True)

views.py:

def index(request):
    latest_person_list2 = Person.objects.filter(to_be_listed=True)
    return object_list(request, template_name='polls/schol.html',
                       queryset=latest_person_list, paginate_by=5)

На шаблоне, когда я звоню person.gender, я получаю 'M'или 'F'вместо 'Male'или 'Female'.

Как отобразить значение ( 'Male'или 'Female') вместо кода ( 'M'/ 'F')?

Shankze
источник
4
возможный дубликат значения параметров печати Django
Игнасио Васкес-Абрамс
Я попробовал этот метод, В моем шаблоне я использую: {% для человека в object_list%} some html {{person.get_gender_display ()}} html {% endfor%} Я получаю следующую ошибку: Значение исключения: Не удалось проанализировать остаток: '()' из 'person.get_gender_display ()'
Shankze
7
Мой Плохой, я не должен был включать '()' после person.get_gender_display. Теперь работает. Спасибо.
Shankze
3
Небольшой комментарий, поскольку пол будет только M или F (длина 1 символ), нет смысла устанавливать максимальную длину поля char 200. С этим max_lenght=1достаточно, чтобы сделать ваш сайт более эффективным, и вы убедитесь, что у вас не будет неправильных данных. :)
Алехандро Гарсия
Возможные дубликаты шаблонов Django: подробная версия выбора
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

503

Похоже, вы были на правильном пути - get_FOO_display()это, безусловно, то, что вы хотите:

В шаблонах вы не включаете ()в название метода. Сделайте следующее:

{{ person.get_gender_display }}
jMyles
источник
Этот метод бесценен. Но кроме использования метода, как можно получить значение, хранящееся в, скажем, {{i.item.what_to_put_here}}?
Хофи
11
Отметим, что для тех, кто использует Jinja2 для своих шаблонов, вы должны включить скобки. {{ person.get_gender_display() }}
Адам б
1
Бонусные баллы: как лучше всего это сделать, если вы отправляете информацию через JSON (например, в сценарии нумерации страниц)? В идеале без дополнительных затрат на создание экземпляров моделей по очереди и вызов get_field_display ().
DylanYoung
7
Должен любить Джанго, почти 10 лет спустя, и ответ по-прежнему в силе! Thx +1 и пей на меня.
Марк
1
Почему-то это не приводит к переводу текста. Любая идея о том, как получить переведенный текст, если i18 уже реализована на сайте?
Anoop Nair
16

Для каждого поля, для которого установлен выбор, у объекта будет метод get_FOO_display (), где FOO - имя поля. Этот метод возвращает «удобочитаемое» значение поля.

В представлениях

person = Person.objects.filter(to_be_listed=True)
context['gender'] = person.get_gender_display()

В шаблоне

{{ person.get_gender_display }}

Документация get_FOO_display ()

Мухаммед Файзан Фарид
источник
1

Другие отмечают, что вам нужен метод get_FOO_display. Я использую это:

def get_type(self):
    return [i[1] for i in Item._meta.get_field('type').choices if i[0] == self.type][0]

который перебирает все варианты, которые имеет конкретный элемент, пока не найдет тот, который соответствует типу элементов

Даниэль О'Брайен
источник