我想显示所选类型的人类可读名称,但我 继续获得储值。
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())
答案 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_data
从ChoiceField
获取类型字段。这个问题是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
。
class abc(forms.Modelform)
class Meta:
model = FOO
widgets = {
'type': forms.TypedChoiceField(coerce=int, required=False, empty_value=0, choices=TYPE_CHOICES),