首页 > 解决方案 > django 选择列表(动态选择)

问题描述

我有一个选择列表:

CATEGORY_CHOICES = (
("T-shirts", "T-shirts"),
("Hoodies", "Hoodies"),
("Shorts", "Shorts"),

)

但我想让这个列表动态化,这样我就可以添加和删除选择,我创建了一个新的模型类别 我想做的是这样的:

CATEGORY_CHOICES = (
for choice in Category.object.all():
    (choice.category, "choice.category"),
 )

但它似乎不起作用

标签: djangomultiple-choicechoicefield

解决方案


在这种情况下,您不应使用 aCharField或其他带有选项的字段,而应使用ForeignKey[Django-doc]

例如:

class Category(models.Model):
    category = models.CharField(max_length=128, unique=True)

    def __str__(self):
        return self.category

class MyModel(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

如果您构造 a ModelForm,它将默认使用 a ModelChoiceField[Django-doc],并且默认小部件是带有Category选项的下拉菜单。

如果要选择多个 Categorys,则应使用ManyToManyField[Django-doc]

class Category(models.Model):
    category = models.CharField(max_length=128, unique=True)

    def __str__(self):
        return self.category

class MyModel(models.Model):
    categories = models.ManyToManyField(Category)

在过滤器中,您可以使用ModelMultipleChoiceFilter[readthedocs]

class MyModelFilter(django_filters.FilterSet):
    categories = django_filters.ModelMultipleChoiceFilter(
        queryset=Category.objects.all()
    )
    class Meta:
        model = MyModel
        fields = ['categories']

但通常情况下,不指定任何它将使用的默认字段。

您可以将小部件更改为CheckboxSelectMultiple[Django-doc]以使用一系列复选框:

class MyModelFilter(django_filters.FilterSet):
    categories = django_filters.ModelMultipleChoiceFilter(
        queryset=Category.objects.all(),
        widget=forms.CheckboxSelectMultiple()
    )
    class Meta:
        model = MyModel
        fields = ['categories']

推荐阅读