如何将MultipleChoiceField添加到Django Admin?

时间:2019-05-26 12:03:33

标签: python django python-3.x django-models django-2.2

我的模型中有一个 CharField 字段。我想将其显示为Django管理站点中的 MultipleChoiceField 小部件。 models.py:

class Product(models.Model):
    ...
    categories = models.CharField()
    ...

我已经在 forms.py 中创建了一个自定义表单小部件:

from django import forms

CATEGORIES_LIST = [
    ('for_him', 'For Him'),
    ('for_her', 'For Her'),
    ('for_kids', 'For Kids'),
]

class Categories(forms.Form):
    categories = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple,
        choices=CATEGORIES_LIST,
    )

不太确定下一步该怎么做。如何为我的产品模型将此小部件与Django Admin连接起来?预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您要尝试的不是使用CharField并直接添加多个选项,因此您必须首先找到一种方法来序列化并将数据还原到模型中,here

如果您使用的是postgres数据库,则可以通过这种方式进行操作(由于使用了postgres数组字段,因此您不必担心序列化和数据恢复问题)

from django.contrib.postgres.fields import ArrayField
class ChoiceArrayField(ArrayField):
    """
    A field that allows us to store an array of choices.

    Uses Django 1.9's postgres ArrayField
    and a MultipleChoiceField for its formfield.

    Usage:

        choices = ChoiceArrayField(models.CharField(max_length=..., choices=(...,)), default=[...])
    """

    def formfield(self, **kwargs):
        defaults = {
            'form_class': forms.MultipleChoiceField,
            'choices': self.base_field.choices,
        }
        defaults.update(kwargs)
        return super(ArrayField, self).formfield(**defaults)

然后可以在模型上使用ChoiceArrayField

更新:

因此要在您的模型上使用它,您可以这样做:

class Product(models.Model):
    categories = ChoiceArrayField(max_length=8, choices=CATEGORIES_LIST, default=['for_him', 'for_her'])