2010-04-19 72 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)