2015-01-12 39 views
0

我有一个具有多对多字段一个模型(我们称之为“选项”)与另一型号Django的形式排除选项中选择字段

当我创建它会显示所有选项的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"] 

比方说,我需要只显示“确定“值并隐藏或不显示”NOT_OK“值。

有什么办法可以用ModelForms做到这一点?

+0

你可以限制你的''的ModelForm的''__init__''方法的项目''。看看这个答案:http://stackoverflow.com/a/16140783/870769。它有助于你的用例吗? – sthzg

+0

这正是我所需要的,发表您的评论作为答案给你一些观点!谢谢! ;) –

回答

1

您当然可以通过使用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 
1

您可以将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如果选择清单应动态地改变。