2016-07-18 5 views
0

장고에서 사용자 정의 양식을 작성하는 방법을 다루고 있습니다. 이제 제출 단계에 머물러 있습니다.SubmitChoiceField form Django

제출을 누르면 __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}) 

역 추적 오류 :

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' 

이 문서를 보면, 내가 그 읽기 같은 방법 보이는 내 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') 

POST 요청은 항상 첫 번째 매개 변수입니다 (request.Post). if form.is_valid():

역 추적을 need more than 1 value to unpack을 라인에 :와 init 메소드에 나는 data=params 작품을 가하고, 가끔 보았다하지만 내 경우에는 내가 오류가 여기에 또한 다른 답변에서 self에 해당 생각

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와 키워드 arg가 모두 동일한 이름으로 이동하므로 허용되지 않습니다.

서명을 전혀 변경하지 마십시오. kwargs에서 여분의 값을 얻으십시오. 당신은 단지 형태로 내부에 그 값을 필요로하기 때문에

def __init__(self, *args, **kwargs): 
    networkList = kwargs.pop('networkList', None) 
    policiesList = kwargs.pop('policiesList', None) 
    applicationList = kwargs.pop('applicationList', None) 
    super(...) 

또는, 당신은이 방법에 요청을 전달하고 직접 거기에 그 값을 받고 고려해 볼 수 있습니다; 동일한 구문이 적용됩니다.

+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의 ID)를 얻거나 잘못 이해했습니다. 또한 튜플이어야합니다. – Aker666