Django Admin 下拉选择

Posted

技术标签:

【中文标题】Django Admin 下拉选择【英文标题】:Django Admin Drop down selections 【发布时间】:2011-11-24 04:06:11 【问题描述】:

我使用 django admin 来更新 mysql 数据库上的各种数据。我为此使用了基本的 django 管理员。输入新数据时,我希望能够拥有它,这样人们只能从几个选项中选择输入新的文本数据。

例如: 该表包含颜色,所以我不能让管理员(在我们的例子中是数据输入个人)在文本框中输入任何内容,我怎样才能让 django 管理员只给他们几个选项供他们选择?

【问题讨论】:

【参考方案1】:

这可以通过模型字段参数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

【讨论】:

我将它与浮点数一起使用:myfield = models.FloatField(choices=[('1.0', '1')] 并在使用下拉菜单时收到一条消息(“没有正确的选择 1.0”)管理员编辑。 这对 django 2.1 仍然有用吗?更多关于创建下拉表单字段的最新答案使用表单模块中的查询集。【参考方案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)

【讨论】:

以上是关于Django Admin 下拉选择的主要内容,如果未能解决你的问题,请参考以下文章

Django admin 中的自定义相关下拉菜单

Django admin禁用外键下拉但保留添加按钮旁边

python django.contrib.admin的下拉过滤器

django admin下拉列表不显示值,显示为object的处理

Django Admin Cookbook-36如何更改下拉菜单中的ForeignKey显示文本

如何在Django Admin后台添加一个省市二级联动下拉列表