2016-07-18 30 views
0

私はDjangoでカスタムフォームを作成する方法を扱っていますが、今は送信ステップに固執しています。Submit ChoiceField form Django

私がsubmitを押すと、私は__init__() got multiple values for keyword argument 'networkList'を得ています。

マイforms.pyそれだ:

def simpleDeploy(request): 
    netList = getDetailsNetworkPartitions(request) 
    polList = getDetailsApplicationPolicies(request) 
    appList = getDetailsApplications(request) 
    if request.method == 'POST': 
     form = SimpleDeploy(request.POST, networkList=None, policiesList=None, applicationList=None) 
     if form.is_valid(): 
      network = form.cleaned_data['Network Partition ID:'] 
      policy = form.cleaned_data['Application Policy ID:'] 
      application = form.cleaned_data['Application ID:'] 
      ##### more things 
     else: 
      simpleForm = SimpleDeploy(networkList=netList, policiesList=polList, applicationList=appList) 
    else: 
     simpleForm = SimpleDeploy(networkList=netList, policiesList=polList, applicationList=appList) 
    return render(request, 'apacheStratos/simpleDeploy.html', {'form': simpleForm}) 

トレースバックエラー:私のviews.py方法で

class SimpleDeploy(forms.Form): 
    def __init__(self, networkList, policiesList, applicationList, *args, **kwargs): 
     super(SimpleDeploy, self).__init__(*args, **kwargs) 
     if networkList and policiesList and applicationList: 
      self.fields['Network Partition ID:'] = forms.ChoiceField(choices=networkList) 
      self.fields['Application Policy ID:'] = forms.ChoiceField(choices=policiesList) 
      self.fields['Application ID:'] = forms.ChoiceField(choices=applicationList) 
     else: 
      self.fields['Network Partition ID:'] = forms.ChoiceField(choices='No network partitions found') 
      self.fields['Application Policy ID'] = forms.ChoiceField(choices='No application policies found') 
      self.fields['Application ID:'] = forms.ChoiceField(choices='No applications found') 

がどのように見える

Traceback: 
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.12-py2.7.egg/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/iago/Escritorio/tfm/website/apacheStratos/views.py" in simpleDeploy 
    60.   form = SimpleDeploy(request.POST, networkList=None, policiesList=None, applicationList=None) 

Exception Type: TypeError at /stratos/simpleDeploy 
Exception Value: __init__() got multiple values for keyword argument 'networkList' 

はドキュメントを見て、私はそれを読んでPOSTリクエストは常に最初のパラメータです(request.Post)そして、私はそれがselfに対応すると考えinitメソッドに、さらに他の回答に、ここで私は時々、がdata=params作品を置くことを見たが、私の場合、私はエラーを取得する:need more than 1 value to unpackトレースバック

if form.is_valid():ライン上:

File "/usr/local/lib/python2.7/dist-packages/Django-1.8.12-py2.7.egg/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/iago/Escritorio/tfm/website/apacheStratos/views.py" in simpleDeploy 
    61.   if form.is_valid(): 
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.12-py2.7.egg/django/forms/forms.py" in is_valid 
    184.   return self.is_bound and not self.errors 
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.12-py2.7.egg/django/forms/forms.py" in errors 
    176.    self.full_clean() 
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.12-py2.7.egg/django/forms/forms.py" in full_clean 
    392.   self._clean_fields() 
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.12-py2.7.egg/django/forms/forms.py" in _clean_fields 
    407.      value = field.clean(value) 
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.12-py2.7.egg/django/forms/fields.py" in clean 
    163.   self.validate(value) 
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.12-py2.7.egg/django/forms/fields.py" in validate 
    868.   if value and not self.valid_value(value): 
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.12-py2.7.egg/django/forms/fields.py" in valid_value 
    878.   for k, v in self.choices: 

Exception Type: ValueError at /stratos/simpleDeploy 
Exception Value: need more than 1 value to unpack 

だから、それは私の間違いですか?ありがとうございました。

答えて

1

最初の位置引数がnetworkListになるように、フォームinitを定義しました。したがって、form = SimpleDeploy(request.POST, networkList=None...)を実行すると、位置指定引数とキーワードargの両方が同じ名前になりますが、これは許可されません。

署名をまったく変更しないでください。 kwargsから余分な値を取得します。

また、フォーム内にこれらの値が必要なだけなので、リクエストをこのメソッドに渡してその値を直接取得することもできます。同じ構文が適用されます。

+0

こんにちはダニエル、あなたの答えをありがとう。私はあなたが示唆したとおりに署名を変更し、現在は動作します。しかし、私はまだ、 "form.is_valid():"というエラーが出ると、 "1行以上の値を必要としています。 (可変\t値) ネットワークパーティションID:\t u'networkパーティション-2' アプリケーションID:\t u'eb2ed6ea-922f-2e56-0129-c0e1c1899ec5' ポストデータに私は値が正しいことを確認することができます アプリケーションポリシーID:\t u'applicationポリシー-2' csrfmiddlewaretoken u'BxsGuIE0iI80wJBkTEXF0sIEmLWXfn2t」 または私はまたタプルを渡す必要がありますか?ありがとう。 – Aker666

+0

'getDetailsNetworkPartitions'と同様の関数が返すものを表示する必要があります。選択肢は一連の2タプルである必要があります。単純なリストを返すだけですか? –

+0

送信すると、はい。ユーザーが選択した値が必要なので、getDetailsNetworkPartitions(要求)、getDetailsApplicationPolicies(要求)、getDetailsApplications(要求)のようなフォームを(u'network-partition-2 '、u'network-パーティション2 ')。送信時に、他のanwsersを読むと、タプルの最初の要素(選択された選択のID)が得られるか、間違ったことを理解しましたか?タプルも必要ですか? – Aker666