Django:显示选择值

356

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)

视图.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')?


5
可能是Django打印选项值的重复问题。 - Ignacio Vazquez-Abrams
2
我尝试了这种方法,在我的模板中使用了以下代码: {% for person in object_list %} some html {{person.get_gender_display() }} html {% endfor %} 但是我遇到了以下错误: 异常值: 无法解析剩余部分:'()',来自 'person.get_gender_display()' - Shankze
9
我的错,我不应该在 person.get_gender_display 后面加上 '()'。现在已经可以了。谢谢。 - Shankze
4
只需要简短评论一下,由于性别只会是M或F(一个字符长度),所以将charfield的最大长度设置为“200”是没有意义的。使用“max_length=1”就足够了,这将使您的网站更加高效,并确保不会出现错误数据。 :) - Alejandro Garcia
可能是Django模板:选择的详细版本的重复问题。 - Ciro Santilli OurBigBook.com
4个回答

694

看起来你已经朝着正确的方向前进了 - get_FOO_display() 绝对是你想要的:

模板中,方法名不需要包含()。按照以下方式操作:

{{ person.get_gender_display }}

我不理解你的子问题。what_to_put_here只是item上的一个方法吗?如果是这样,那么你的语法是正确的。这个问题涉及到在Field对象中具有命名选项的特定情况。 - jMyles
17
请注意,对于使用Jinja2模板的人,您应该包括括号。{{ person.get_gender_display() }} - adam b
1
奖励分:如果您通过JSON发送信息(例如在分页场景中),最好的方法是什么?理想情况下,不需要逐个实例化模型并调用get_field_display()。 - DylanYoung
9
太喜欢 Django 了,近10年过去了,答案仍然有效!谢谢+1,我请客喝酒。 - Marc
1
如果网站已经实现了i18,但是仍然无法获取翻译文本,您有什么想法吗? - Anoop Nair
显示剩余5条评论

50
对于每个具有选择集的字段,对象将拥有一个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() 文档


0
我是通过以下方式定义常量的:

class Person(models.Model):
    MALE = 'M'
    FEMALE = 'F'
    CATEGORY_CHOICES = (
        (MALE, 'Male'),
        (FEMALE, 'Female'),
    )

    name = models.CharField(max_length=200)
    gender = models.CharField(max_length=200, choices=CATEGORY_CHOICES)
    to_be_listed = models.BooleanField(default=True)
    description = models.CharField(max_length=20000, blank=True)

M 和 F 的值将被存储在数据库中,而 Male 和 Female 的值将在所有地方显示。


-2

其他人已经指出,你需要一个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]

这个程序会迭代遍历特定物品的所有选项,直到找到与该物品类型相匹配的选项。


1
您也可以使用 Product.category.field.choices - lcjury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接