0

如何将参数传递给 ModelForm Field 构造函数?

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',
            )

在底层模型中,“事物”是一个models.ForeignKey,默认显示每个可能的关系是不合适的。

4

2 回答 2

1

如果visible_things是查询集,则可以更改queryset表单字段的属性:

self.fields['things'].queryset = instance.visible_things

它确实必须是一个查询集,而不是任意可迭代的,但除此之外它很容易。

于 2013-11-07T22:45:05.380 回答
0

如果 arg 是可选的,只需添加一个 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)

或者,如果需要,只需将其添加到初始化签名中:

def __init__(self, thing, *args, **kwargs):
    pass

并这样称呼它:

myform = ThingSettingsForm(<my instance>)
于 2013-11-09T00:25:52.573 回答