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'or 'F'而不是'Male'or 'Female'

如何显示值('Male''Female')而不是代码('M'/ 'F')?



我尝试了这种方法,在我的模板中使用的是:{%为object_list%中的人}一些html {{person.get_gender_display()}} html {%endfor%}我收到以下错误:异常值:无法解析其余部分:来自“ person.get_gender_display()”的“()”
Shankze 2010年

7
不好意思,我不应该在person.get_gender_display之后包括'()'。现在正在工作。谢谢。
Shankze 2010年

3
请稍加评论,由于性别只会是M或F(长度为1个字符),因此将charfield的最大长度设置为毫无意义200。使用max_lenght=1足够了,它将使您的网站更高效,并且将确保您不会有错误的数据。:)
Alejandro Garcia

Answers:


501

看来您处在正确的轨道上- get_FOO_display()无疑是您想要的:

模板中,您不包括()方法名称。请执行下列操作:

{{ person.get_gender_display }}

这种方法是无价的。但是除了使用该方法外,还有什么方法可以检索{{i.item.what_to_put_here}}中存储的值?
KhoPhi 2015年

11
请注意,对于使用Jinja2作为模板的任何人,都应加上括号。{{ person.get_gender_display() }}
亚当b

1
优点:如果通过JSON发送信息(例如在分页方案中),执行此操作的最佳方法是什么?理想情况下,无需一一实例化模型并调用get_field_display()的开销。
DylanYoung

7
要爱Django,将近十年后,答案仍然有效!Thx +1喝酒。
Marc

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]

遍历特定项目的所有选择,直到找到与项目类型匹配的项目

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.