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

时间:2013-11-07 22:27:37

标签: django django-forms

如何将参数传递给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,默认显示每个可能的关系是不合适的。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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)

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

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

并称之为:

myform = ThingSettingsForm(<my instance>)