django模型选择选项作为多选框
假设我有这样的模型
COLORS= (
('R', 'Red'),
('B', 'Yellow'),
('G', 'White'),
)
class Car(models.Model):
name = models.CharField(max_length=20)
color= models.CharField(max_length=1, choices=COLORS)
它在管理面板中显示为一个选择框,但是我希望我的管理员用户可以多选择选择多对多关系等颜色,如何在没有某种('RB',
'Red&Blue'),
逻辑的情况下实现呢?
-
可以
Car
有多个color
s吗?在这种情况下,color
应该是多对多的关系,而不是一种关系CharField
。另一方面,如果您想执行类似Unix的权限(例如Red + Blue,Red + Blue +
Green等),则为它们中的每一个分配数字值并创建color
一个整数字段。更新资料
(阅读评论后)您可以使用自定义表单在Admin中代替默认模型来编辑模型
ModelForm
。此自定义表单可以使用允许用户选择多种颜色的多项选择小部件。然后,您可以覆盖clean()
表格的方法以返回适当的串联值(“
RB”等)。更新2
这是一些代码:
首先,从模型字段中删除选择。还要将其最大大小增加到2。在这里我们不需要选择-如果需要,则必须为每种颜色组合添加一个选择。
class Car(models.Model): ... color= models.CharField(max_length=2)
第二个添加自定义
ModelForm
以在管理应用程序中使用。此表单将覆盖颜色,而是将其声明为多选字段。我们 确实 需要这里的选择。COLORS= ( ('R', 'Red'), ('B', 'Yellow'), ('G', 'White'), ) class CarAdminForm(ModelForm): color = forms.MultipleChoiceField(choices = COLORS) class Meta: model = Car def clean_color(self): color = self.cleaned_data['color'] if not color: raise forms.ValidationError("...") if len(color) > 2: raise forms.ValidationError("...") color = ''.join(color) return color
请注意,我仅添加了两个验证。您可能需要更多和/或自定义验证。
最后,向admin注册此表单。在您的内部
admin.py
:class CarAdmin(admin.ModelAdmin): form = CarAdminForm admin.site.register(Car, CarAdmin)