我的模型中有一个 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连接起来?预先感谢您的帮助!
答案 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'])