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'), 类型的逻辑,如何实现这一点

原文由 Hellnar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

一个 Car 可以有多个 color 吗?在那种情况下 color 应该是 多对多关系 而不是 CharField 。另一方面,如果您想执行类似 Unix 权限 的操作(即红 + 蓝、红 + 蓝 + 绿等),则为它们中的每一个分配数值,并使 color 成为一个 整数字段

更新

(阅读评论后)您可以使用 自定义表单 在管理员中编辑您的模型,而不是默认的 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.py 里面:

 class CarAdmin(admin.ModelAdmin):
    form = CarAdminForm

admin.site.register(Car, CarAdmin)

原文由 Manoj Govindan 发布,翻译遵循 CC BY-SA 2.5 许可协议

我用有意义的模型构建了一个完整的工作示例。它工作完美。我已经在 Python 3.4.x 和 Django 1.8.4 上测试过它。首先我运行管理面板并为 Thema 模型中的每个选项创建记录

模型.py

 from django.db import models

class Author(models.Model):
    fname = models.CharField(max_length=50)
    lname = models.CharField(max_length=80)

    def __str__(self):
        return "{0} {1}".format(self.fname, self.lname)

class Thema(models.Model):
    THEME_CHOICES = (
        ('tech', 'Technical'),
        ('novel', 'Novel'),
        ('physco', 'Phsycological'),
    )
    name = models.CharField(max_length=20,choices=THEME_CHOICES, unique=True)

    def __str__(self):
        return self.name

class Book(models.Model):

    name = models.CharField(max_length=50)
    author = models.ForeignKey(Author)
    themes = models.ManyToManyField(Thema)

    def __str__(self):
        return "{0} by {1}".format(self.name,self.author)

表单.py

 from django import forms

from .models import *

class BookForm(forms.ModelForm):
    themes = forms.ModelMultipleChoiceField(queryset=Thema.objects, widget=forms.CheckboxSelectMultiple(), required=False)

管理员.py

 from django.contrib import admin

from .models import *
from .forms import *

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    pass

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    form = BookForm

@admin.register(Thema)
class ThemaAdmin(admin.ModelAdmin):
    pass

原文由 Serjik 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏