django模型选择选项作为多选框

发布于 2021-01-29 15:13:18

假设我有这样的模型

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'),逻辑的情况下实现呢?

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    可以Car有多个colors吗?在这种情况下,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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看