2010-04-19 104 views
1

我正在嘗試編寫一個Django-subclassed ModelChoiceField類,它知道如何加載自己,但我沒有很好的計算出所需的模式。我不希望使用我的字段的表單類必須設置標籤和必需屬性以外的任何其他類;也就是說,我不想在每個使用此字段的表單中放置重複的查詢集邏輯。Django-subclassed ModelChoiceField封裝

所以像這樣的東西,雖然這不起作用,因爲queryset參數沒有設置在字段的構造函數中。我想我可以通過「queryset = Test.object.none()」,但我寧願我的表單不必將僞代碼放在那裏。

class MyForm(forms.Form): 
    c = MyModelChoiceField(label='Test', required=False) 

class MyModelChoiceField(forms.ModelChoiceField): 
    def __init__(self, *args, **kwargs): 
     super(MyModelChoiceField, self).__init__(*args, **kwargs) 
     self.queryset = Test.objects.filter(id__gt=1) 

有沒有例子說明如何做到這一點?我確定有 - 我今天似乎無法在Google上找到它們。

回答

3

我想,而不是設置__init__您可以覆蓋kwargs然後調用超級超級後的查詢集:

class MyModelChoiceField(forms.ModelChoiceField): 
    def __init__(self, *args, **kwargs): 
     kwargs['queryset'] = Test.objects.filter(id__gt=1) 
     super(MyModelChoiceField, self).__init__(*args, **kwargs)