Django 表单排除 select 字段中的选项
Django form exclude options in select field
我有一个模型有一个 ManyToMany 字段(我们称之为 "Options")和另一个模型
当我创建 ModelForm 时,它会显示所有选项。
有什么方法可以排除某些选项值或仅显示其中的某些选项值吗?
这是一个例子:
models.py
class Options (model.Models):
name = ...
...
class Anything (model.Models):
...
options = ManyToManyField(Options)
我的数据库中 "Options" 的值:
["OK",
"OK_2",
"NOT_OK",
"OK_3,
"NOT_OK_2"]
假设 我只需要显示 "OK" 值 并隐藏或不显示 "NOT_OK" 值。
有没有办法用 ModelForms 做到这一点?
您可以将 limit_choices_to
参数传递给您的 ManyToMany
字段:
from django.db.models import Q
class Anything (models.Model):
options = models.ManyToManyField(Options,
limit_choices_to=Q(name__startswith='OK'))
在 django 1.7 中,您甚至可以 pass a callable 以防选择列表需要动态更改。
您当然可以使用 Form 或更常见的 ModelForm 在相关模型上过滤外键字段或 m2m 的查询集。
之所以在表单级别执行此操作很有用,是因为过滤很可能基于并非在所有情况下都适用的业务逻辑,因此比例如针对模型定义它具有更大的灵活性。
虽然您可以在定义表单字段时执行此操作,但最好在构建表单后执行此操作,因此它发生在运行时而不是编译时(我刚刚经历过一些有趣的情况给我带来了一些问题,但那是 Django 的早期版本!)
以下 ModelForm 可以完成这项工作:
class AnythingForm(ModelForm):
options = forms.MultipleChoiceField()
def __init__(self, **kwargs):
super(AnythingForm, self).__init__(self, **kwargs)
self.fields['options'].queryset = Option.objects.filter({pass in your filters here...})
class Meta:
model = Anything
我有一个模型有一个 ManyToMany 字段(我们称之为 "Options")和另一个模型
当我创建 ModelForm 时,它会显示所有选项。
有什么方法可以排除某些选项值或仅显示其中的某些选项值吗?
这是一个例子:
models.py
class Options (model.Models):
name = ...
...
class Anything (model.Models):
...
options = ManyToManyField(Options)
我的数据库中 "Options" 的值:
["OK",
"OK_2",
"NOT_OK",
"OK_3,
"NOT_OK_2"]
假设 我只需要显示 "OK" 值 并隐藏或不显示 "NOT_OK" 值。
有没有办法用 ModelForms 做到这一点?
您可以将 limit_choices_to
参数传递给您的 ManyToMany
字段:
from django.db.models import Q
class Anything (models.Model):
options = models.ManyToManyField(Options,
limit_choices_to=Q(name__startswith='OK'))
在 django 1.7 中,您甚至可以 pass a callable 以防选择列表需要动态更改。
您当然可以使用 Form 或更常见的 ModelForm 在相关模型上过滤外键字段或 m2m 的查询集。
之所以在表单级别执行此操作很有用,是因为过滤很可能基于并非在所有情况下都适用的业务逻辑,因此比例如针对模型定义它具有更大的灵活性。
虽然您可以在定义表单字段时执行此操作,但最好在构建表单后执行此操作,因此它发生在运行时而不是编译时(我刚刚经历过一些有趣的情况给我带来了一些问题,但那是 Django 的早期版本!)
以下 ModelForm 可以完成这项工作:
class AnythingForm(ModelForm):
options = forms.MultipleChoiceField()
def __init__(self, **kwargs):
super(AnythingForm, self).__init__(self, **kwargs)
self.fields['options'].queryset = Option.objects.filter({pass in your filters here...})
class Meta:
model = Anything