django - django 选择列表(动态选择)
问题描述
我有一个选择列表:
CATEGORY_CHOICES = (
("T-shirts", "T-shirts"),
("Hoodies", "Hoodies"),
("Shorts", "Shorts"),
)
但我想让这个列表动态化,这样我就可以添加和删除选择,我创建了一个新的模型类别 我想做的是这样的:
CATEGORY_CHOICES = (
for choice in Category.object.all():
(choice.category, "choice.category"),
)
但它似乎不起作用
解决方案
在这种情况下,您不应使用 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
选项的下拉菜单。
如果要选择多个 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.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']
推荐阅读
- macos - How to pass value from apple script to shell script in Automator?
- c - Difference between function with returned type pointer and function pointer
- flyway - Flyway 社区版是否支持 Oracle 19.7?
- flutter - Provide different children if Wrap is multi-line vs single-line
- c++ - How can I have code called (e.g., a function) when the player changes text cursor position in a multiline text box?
- angular - How to unit test just one function, without browser, on Angular
- react-native - React native: Is it possible to set initial position to SectionList without using scrollToLocation
- python - How to use thread in asyncio?
- python - 如何连接一个 Dataframe 列的值?
- amazon-web-services - 从 S3 存储桶中删除空文件