将 kwargs 参数传递给 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',
            )

在底层模型中,"事物"是一个模型。外键,并且默认显示每个可能的关系是不合适的。

如果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>)

最新更新