django 选择列表(动态选择)

django Choice list (dynamic choices)

我有一个选择列表:

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

)

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

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

但是好像不行

在这种情况下,您不应使用 CharField 或其他带选项的字段,而应使用 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.<b>ForeignKey(</b>Category, on_delete=models.CASCADE<b>)</b>

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

如果你想select 多个 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.<b>ManyToManyField(</b>Category<b>)</b>

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

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

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

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

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