【问题标题】:Submit ChoiceField form Django提交 ChoiceField 表单 Django
【发布时间】:2016-07-18 08:58:00
【问题描述】:

我正在处理如何在 Django 中制作自定义表单,现在我被困在提交步骤上。

当我按下提交时,我会收到一个__init__() got multiple values for keyword argument 'networkList'。

我的forms.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')

在我的views.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'

查看文档,我读到 POST 请求始终是第一个参数 (request.Post),在 init 方法上我认为它与 self 相对应,此外,在其他答案中,我有时看到,把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

那么,我的错误在哪里?谢谢和问候。

【问题讨论】:

    标签: python django forms post choicefield


    【解决方案1】:

    您已经定义了表单 init,因此第一个位置参数是 networkList;所以当你执行form = SimpleDeploy(request.POST, networkList=None...) 时,位置参数和关键字参数都使用相同的名称,这是不允许的。

    根本不要更改签名;从 kwargs 中获取额外的值。

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

    另外,由于您只需要表单中的这些值,您可以考虑将请求传递给此方法并直接从那里获取这些值;相同的语法将适用。

    【讨论】:

    • 您好丹尼尔,感谢您的回答。我已经按照您的建议更改了签名,现在可以使用了。但是我仍然收到“如果 form.is_valid(): 需要超过 1 个值来解压就行了”错误。在发布的数据上,我可以看到这些值是正确的:(变量值)网络分区 ID:u'network-partition-2' 应用程序 ID:u'eb2ed6ea-922f-2e56-0129-c0e1c1899ec5' 应用程序策略 ID:u' application-policy-2' csrfmiddlewaretoken u'BxsGuIE0iI80wJBkTEXF0sIEmLWXfn2t' 或者我还需要传递一个元组?谢谢。
    • 您应该显示getDetailsNetworkPartitions 和类似函数的返回值。选择需要是一系列 2 元组;你只是返回一个简单的列表吗?
    • 提交时,是的。因为我想要用户选择的值,但是当我填写 getDetailsNetworkPartitions(request)、getDetailsApplicationPolicies(request)、getDetailsApplications(request) 表单时,它们返回一个元组,如 (u'network-partition-2', u'network-分区-2')。在提交时,阅读其他答案时,您会得到元组的第一个元素(所选选项的 id)还是我理解错了?它也需要是一个元组?
    • 我不明白你的评论,抱歉。选择就是选择,你是否在提交中没有区别。
    • 嗯,填写表格,3个函数返回一个元组('id','display_name')。我没有收到渲染模板的错误,当我按下提交时发生错误。
    猜你喜欢
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2017-02-17
    • 2012-03-09
    相关资源
    最近更新 更多