如何在Django管理中添加多选字段?

2 人关注

我有一个 字段 在我的模型中的字段。我想把它显示为一个 MultipleChoiceField Django管理站点中的小部件。 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连接起来?谢谢你的帮助!

python
django
django-models
Android_Minsky
Android_Minsky
发布于 2019-05-26
2 个回答
Amir Heshmati
Amir Heshmati
发布于 2022-09-04
已采纳
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'])
    
谢谢你!但是,请你告诉我如何在实际例子中使用ArrayField。但是,请你告诉我如何在一个实际的例子中使用ArrayField,到底应该在我的models.py中添加什么?我有点迷糊了。再次感谢您对我的帮助。
@Android_Minsky 编辑了该回答并添加了一个例子
Abdullah Özel
Abdullah Özel
发布于 2022-09-04
0 人赞同

Use MultipleChoiceField in Admin Form

in your forms.py

class Categories(forms.Form):
    categories = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple,
        choices=CATEGORIES_LIST,
    def __init__(self, *args, **kwargs):