利用get_FOO_display()

时间:2010-02-08 15:32:46

标签: django django-models

我想显示所选类型的人类可读名称,但我 继续获得储值。

TYPE_CHOICES = (
    ('0', 'Basic'),
    ('1', 'Full'),
    ('2', 'Intermediate'),
)

class ServiceType(models.Model):
       type = models.IntegerField(max_length=1, choices=TYPE_CHOICES)
       amount = models.DecimalField(max_digits=10, decimal_places=2)

       def __unicode__(self):
            return '%s' % (self.get_type_display()) 

5 个答案:

答案 0 :(得分:4)

似乎你有答案,但作为另一个链接,我想指出James Bennett对此的看法: Handle choices the right way

我认为这是一种非常方便的做事方式,并消除了事物的“神奇数字”方面。值得一读IMO,即使您选择其他选项。

从他的文章(如果它消失的情况引用):

class Entry(models.Model):
    LIVE_STATUS = 1
    DRAFT_STATUS = 2
    HIDDEN_STATUS = 3
    STATUS_CHOICES = (
        (LIVE_STATUS, 'Live'),
        (DRAFT_STATUS, 'Draft'),
        (HIDDEN_STATUS, 'Hidden'),
    )
    # ...some other fields here...
    status = models.IntegerField(choices=STATUS_CHOICES, default=LIVE_STATUS)

现在我们可以像这样导入Entry模型和查询:

live_entries = Entry.objects.filter(status=Entry.LIVE_STATUS)
draft_entries = Entry.objects.filter(status=Entry.DRAFT_STATUS)

答案 1 :(得分:1)

您可能希望在模型中使用ChoiceField而不是IntegerField。听起来您在管理员中看到了带有type = text的输入标记,但想要一个select标记。与IntegerField关联的默认小部件是TextInput,它可以解释您所看到的内容。

另一种选择是编写自己的管理员并明确地调出您希望type为admin中的ChoiceField。像这样:

class ServiceTypeAdmin(admin.ModelAdmin):
    # ...
    type = fields.ChoiceField(choices=TYPE_CHOICES)

admin.site.register(ServiceType, ServiceTypeAdmin)

我个人首先将IntegerField切换到ChoiceField。减少工作量。

答案 2 :(得分:0)

我遇到了同样的问题,并且无法弄清楚它的工作原理,但是如果你将字段类型更改为CharField,则get_type_display应该可以正常工作。

TYPE_CHOICES = (
  ('B', 'Basic'),
  ('F', 'Full'),
  ('I', 'Intermediate'),
)

class ServiceType(models.Model):
   type = models.CharField(max_length=1, choices=TYPE_CHOICES)
   amount = models.DecimalField(max_digits=10, decimal_places=2)

答案 3 :(得分:0)

新手错误,我已经将元组值从('0','基本)更改为(0,'基本')并且它有效。我没有意识到我将char值保存为整数值。

感谢您的帮助。

答案 4 :(得分:0)

使用TypedChoiceField()

你的问题的答案在于使用TypedChoiceField,而不是ChoiceField

您正使用django form中的cleaned_dataChoiceField获取类型字段。这个问题是ChoiceField的输出是一个字符串,而不是一个整数。 如果您在保存表单后立即使用get_type_display(),则可能会获得该值,但是当您尝试从数据库中检索值时,您将获得integer而不是字符串(因为您正在保存输入整数字段),这里你不能用get_type_display.

获得价值

现在看看这个,我看到你应该使用TypedChoiceField,以确保来自cleaning_data的输出总是一个整数或字符串。

首先将IntergerField更改为字段字段或SmallIntergetField

希望这会有所帮助。

代码

 type = models.SmallIntegerField(choices=TYPE_CHOICES)

在forms.py

type = TypedChoiceField(coerce=int, required=False, empty_value=0, choices=TYPE_CHOICES)

另一种可能性是您可以使用MODELFORM并为该字段提供widgets

Forms.py

class abc(forms.Modelform)
    class Meta:
        model = FOO
    widgets = {
                'type': forms.TypedChoiceField(coerce=int, required=False, empty_value=0, choices=TYPE_CHOICES),