python – 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’)的情况下实现这一点,类型逻辑

最佳答案
汽车可以有多种颜色吗?在这种情况下,颜色应该是many to many relationship而不是CharField.另一方面,如果你想做一些像Unix permissions(即红蓝,红蓝绿等)的东西,那么为每一个分配数值,并使颜色为integer field.

更新

(阅读评论后)您可以使用custom form在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)

转载注明原文:python – django模型选择选项作为多选框 - 代码日志