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