Django管理后台下拉选择

18

我使用Django管理工具来更新MySQL数据库中的各种数据。使用基本的Django管理工具。在输入新数据时,我希望人们只能从几个选项中选择来输入新的文本数据。

例如: 表格包含颜色信息,因此不要让管理员(数据录入人员)只是随意在文本框中输入任何内容,我该如何让Django管理工具仅提供几个选项供他们选择?

2个回答

33

可以通过模型字段参数choices来实现。

myfield = models.CharField(max_length=256, choices=[('green', 'green'), ('red', 'red')])
这样做的唯一问题是,如果您在数据库中已经有一个与这些值不匹配的值,Django 可能会将其默认为其中一个选项。
如果这是个问题,并且您想保留这些值,我建议覆盖管理表单并仅在添加操作时提供 ChoiceField,或者动态添加任何数据库中存在的值作为有效选项之一。
class MyForm(ModelForm):
    MY_CHOICES = [('green', 'green'), ('red', 'red')]
    def __init__(self, *args, **kwargs):
       super(MyForm, self).__init__(*args, **kwargs)
       if self.instance.id:
           CHOICES_INCLUDING_DB_VALUE = [(self.instance.field,)*2] + self.MY_CHOICES
           self.fields['my_field'] = forms.ChoiceField(
                choices=CHOICES_INCLUDING_DB_VALUE)
       

class MyAdmin(admin.ModelAdmin):
    form = MyForm

我在使用浮点数(floats)时,将其用于字段(myfield),代码如下:models.FloatField(choices=[('1.0', '1')]。但是,在管理页面中使用下拉菜单进行编辑时,会收到一个消息("no correct selection 1.0")。 - Timo
这对于Django 2.1仍然适用吗?有关创建下拉表单字段的更近期的答案使用了forms模块中的querysets。 - Lawrence DeSouza

2
最好在你的模型中定义一个“models.CharField”字段类型。
your_choices = (
        ('1', u'yello'),
        ('2', u'red'),
        ('3', u'black'),
    )

types = models.CharField(max_length=32, choices=your_choices, null=True, blank=True)

然后在 "admin.py" 中,您应该像下面这样在自定义管理类中添加这个新字段。

class YourModelAdmin(admin.ModelAdmin):
    fields = ('types', )

admin.site.register(YourModel, YourModelAdmin)

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