2

次のように、ModelForm オブジェクトに追加のパラメーターを与えるにはどうすればよいですか: ModelForm オブジェクトを初期化します。

form = ChangeProfile(request.POST, initial={'first_name':costumer.first_name, 'last_name':costumer.last_name}, extraParameter) 

そして、このクラスでextraParameterを取得するにはどうすればよいですか:

class ChangeProfile(ModelForm):

このようなコンストラクタを作成するのは、それほど素晴らしい考えではありません

def __init__(self, request, initial, extraParamter):

私はここで何をすべきですか?

4

2 に答える 2

3

単純な Python クラスのように、さまざまな方法でパラメーターを渡すことができます。Django フォーム/モデルフォームのデフォルトの動作を壊さないように注意する必要があります。

class YourForm(forms.Form):
    def __init__(self, custom_arg=None, *args, **kwargs):
        # We have to pop the 'another_arg' from kwargs,
        # because the __init__ from 
        # forms.Form, the parent class, 
        # doesn't expect him in his __init__.
        self.another_arg = kwargs.pop('another_arg', None)

        # Calling the __init__ from the parent, 
        # to keep the default behaviour
        super(YourForm, self).__init__(*args, **kwargs)

        # In that case, just our __init__ expect the custom_arg
        self.custom_arg = custom_arg

        print "Another Arg: %s" % self.another_arg
        print "Custom Arg: %s" % self.custom_arg


# Initialize a form, without any parameter
>>> YourForm()
Another Arg: None
Custom Arg: None
<YourForm object at 0x102cc6dd0>

# Initialize a form, with a expected parameter
>>> YourForm(custom_arg='Custom arg value')
Another Arg: None
Custom Arg: Custom arg value
<YourForm object at 0x10292fe50>

# Initialize a form, with a "unexpected" parameter
>>> YourForm(another_arg='Another arg value')
Another Arg: Another arg value
Custom Arg: None
<YourForm object at 0x102945d90>

# Initialize a form, with both parameters
>>> YourForm(another_arg='Another arg value',
             custom_arg='Custom arg value')
Another Arg: Another arg value
Custom Arg: Custom arg value
<YourForm object at 0x102b18c90>
于 2013-04-23T06:10:33.960 に答える
0

このようなシナリオでは、オーバーライドする必要があります__init__

ただし、あなたの署名に__init__はバグがあります。

やったほうがいい:

class ChangeProfile(ModelForm):
    def __init__(self, *args, **kwargs):
        self.extraParameter = kwargs.pop("extraParameter")
        super(ChangeProfile, self).__init__(*args, **kwargs)
        #any other thing you want

ビューから:

extraParameter = "hello"

#GET request
form=ChangeProfile(initial={'first_name':costumer.first_name, 'last_name':costumer.last_name}, extraParameter=extraParameter)

#POST request
form=ChangeProfile(request.POST ,initial={'first_name':costumer.first_name, 'last_name':costumer.last_name}, extraParameter=extraParameter)
于 2013-04-23T06:10:06.960 に答える