2015-01-12 38 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如果選擇清單應動態地改變。