Django: відображення значення вибору


245

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')?



Я спробував цей метод. У своєму шаблоні я використовую: {% for person in object_list%} деякий html {{person.get_gender_display ()}} html {% endfor%} Я отримую таку помилку: Значення винятку: Не вдалося проаналізувати решта: '()' від 'person.get_gender_display ()'
Shankze

7
Мій поганий, я не повинен був включати "()" після person.get_gender_display. Його працює зараз. Дякую.
Шенкзе

3
Лише невеликий коментар, оскільки стать буде лише M або F (довжина 1 символу), не має сенсу встановлювати максимальну довжину charfield до 200. З max_lenght=1цього достатньо, зробить ваш сайт більш ефективним, і ви переконаєтесь, що у вас не буде помилкових даних. :)
Алехандро Гарсія

Відповіді:


502

Схоже, ви були на правильному шляху - get_FOO_display()це, безумовно, те, що ви хочете:

У шаблонах ви не включаєте ()в ім'я методу. Зробіть наступне:

{{ person.get_gender_display }}

Цей метод безцінний. Але окрім використання методу, який спосіб отримати значення, збережене у скажімо, {{i.item.what_to_put_here}}?
Хофі

11
Зауважимо, для тих, хто використовує Jinja2 для своїх шаблонів, слід включити дужки. {{ person.get_gender_display() }}
adam b

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]

який повторює всі варіанти, які має певний предмет, поки не знайде той, що відповідає типу елементів

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.