我有一个模型,它有一个ManyToMany字段(让我们称之为“选项”)与另一个模型
当我创建ModelForm时,它会显示所有选项。
是否有任何方法排除某些选项值或只显示其中一些选项值?
下面是一个示例:
models.py
class Options (model.Models):
name = ...
...
class Anything (model.Models):
...
options = ManyToManyField(Options)在我的数据库中“选项”的值:
["OK",
"OK_2",
"NOT_OK",
"OK_3,
"NOT_OK_2"]假设,我只需要显示"OK“值,并隐藏或不显示"NOT_OK”值。
有什么方法可以用ModelForms来完成吗?
发布于 2015-01-13 02:25:32
当然,您可以使用表单或更常见的m2m来筛选相关模型上外键字段或ModelForm的查询集。
在表单级别这样做是有用的,因为过滤很可能基于业务逻辑,而业务逻辑并不适用于所有情况,因此比根据模型定义更灵活。
虽然您可以在定义表单字段时做到这一点,但最好是在表单被构造之后才这样做,因此它是在运行时而不是编译时发生的(我刚刚经历了一些有趣的情况,这给我带来了一些问题,但是这是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发布于 2015-01-12 21:45:36
可以将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中,如果选择列表需要动态更改,甚至可以使用传递一个可调用的。
https://stackoverflow.com/questions/27910922
复制相似问题