如何将参数传递给模型表单字段构造函数?
class ThingSettingsForm(ModelForm):
things = forms.ModelChoiceField(empty_label='--',queryset=self.?????)
def __init__(self, *args, **kwargs):
super(ThingSettingsForm, self).__init__(*args, **kwargs)
if 'instance' in kwargs:
instance = kwargs['instance']
?????? = instance.visible_things
#self.fields['things'] =
#forms.ModelChoiceField(queryset=instance.visible_things)
class Meta:
model = Gallery
fields = (
'title',
'summary',
'things',
)
在底层模型中,"事物"是一个模型。外键,并且默认显示每个可能的关系是不合适的。
如果visible_things
是查询集,则可以更改表单域的queryset
属性:
self.fields['things'].queryset = instance.visible_things
它确实必须是一个查询集,而不是一个任意的可迭代对象,但除此之外它很容易。
如果参数是可选的,只需添加一个 kwarg:
myform = ThingSettingsForm(thing=<my instance>)
你必须改变 init 方法才能首先弹出你的新 arg,因为 super 并不期待这个 arg:
def __init__(self, *args, **kwargs):
instance = kwargs.pop('thing', None)
super(ThingSettingsForm, self).__init__(*args, **kwargs)
或者如果需要,只需将其添加到 init 签名中:
def __init__(self, thing, *args, **kwargs):
pass
并这样称呼它:
myform = ThingSettingsForm(<my instance>)