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 多个 Category
s,你应该使用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']
我有一个选择列表:
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 多个 Category
s,你应该使用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']