我正在尝试编写一个Django子类的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)
有没有关于如何实现这一目标的例子?我确信有 - 我今天似乎无法在谷歌找到它们。
答案 0 :(得分:3)
我认为不是在超级__init__
之后设置查询集,而是可以覆盖kwargs,然后调用super:
class MyModelChoiceField(forms.ModelChoiceField):
def __init__(self, *args, **kwargs):
kwargs['queryset'] = Test.objects.filter(id__gt=1)
super(MyModelChoiceField, self).__init__(*args, **kwargs)