表单中带有复选框的 Django WizardView 导致 "ValueError too many values to unpack (expected 2)"
Django WizardView with checkboxes in Form causes "ValueError too many values to unpack (expected 2)"
我正在使用 WizardView,其中第二个表单是:
FRAME_AND_ALIGNMENT_CHOICES = ["Align Derailleur Hanger", "Basic Clean",
"Install Front Basket"]
class RepairsForm(Form):
frame_and_alignment = forms.MultipleChoiceField(
choices=FRAME_AND_ALIGNMENT_CHOICES,
widget=forms.CheckboxSelectMultiple
)
我有一个像这样的 WizardView:
NEW_ORDER_TEMPLATES = {'0': 'app/create_customer.html', '1': 'app/repairs.html'}
class CustomerWizard(SessionWizardView):
def get_template_names(self):
return [NEW_ORDER_TEMPLATES[self.steps.current]]
def done(self, form_list, **kwargs):
customer_id = process_customer(form_list[0])
process_repairs(form_list[1], customer_id)
return HttpResponseRedirect(reverse('app:index'))
最后,这是我的第二种形式的模板:
<form action="" method="post">
{% csrf_token %}
{{ wizard.management_form }}
{{ wizard.form.frame_and_alignment }}
{# {{ wizard.form.as_p }}#}
<input type="submit" value="Save" />
</form>
表单的第一页填写得很好,但是当我点击提交以继续使用此模板和表单时,我在语句 {{ wizard.form.frame_and_alignment }}
上收到一个 ValueError,内容为 "too many values to unpack (expected 2)"。我的猜测是它与 MultipleChoiceField 或其他东西有关。
编辑这是回溯
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/create_order/
Django Version: 1.7.2
Python Version: 3.4.2
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.formtools',
'app')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Template error:
In template /Users/johnking/workspace/rice-bikes/app/templates/app/repairs.html, error at line 10
too many values to unpack (expected 2)
1 : {% extends "app/base.html" %}
2 :
3 : {% block content %}
4 :
5 : {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
6 :
7 : <form action="" method="post">
8 : {% csrf_token %}
9 : {{ wizard.management_form }}
10 : {{ wizard.form.frame_and_alignment }}
11 : {# {{ wizard.form.as_p }}#}
12 : <input type="submit" value="Save" />
13 : </form>
14 :
15 :
16 : {% endblock %}
Traceback:
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
137. response = response.render()
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/response.py" in render
103. self.content = self.rendered_content
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/response.py" in rendered_content
80. content = template.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in render
148. return self._render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/loader_tags.py" in render
126. return compiled_parent._render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/loader_tags.py" in render
65. result = block.nodelist.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/debug.py" in render
93. output = force_text(output)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/utils/encoding.py" in force_text
83. s = six.text_type(s)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/forms/forms.py" in __str__
508. return self.as_widget()
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/forms/forms.py" in as_widget
560. return force_text(widget.render(name, self.value(), attrs=attrs))
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/forms/widgets.py" in render
739. return self.get_renderer(name, value, attrs, choices).render()
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/forms/widgets.py" in render
687. choice_value, choice_label = choice
Exception Type: ValueError at /create_order/
Exception Value: too many values to unpack (expected 2)
您的 choices
应该是两个项目的可迭代列表。
您可以执行以下任一操作:
FRAME_AND_ALIGNMENT_CHOICES = [
("Align Derailleur Hanger", "Align Derailleur Hanger")
("Basic Clean", "Basic Clean"),
("Install Front Basket", "Install Front Basket"),
]
或者使用列表理解来减少重复:
FRAME_AND_ALIGNMENT_CHOICES = [(c, c) for c in ["Align Derailleur Hanger", "Basic Clean", "Install Front Basket"]]
或者,您可能希望将代码存储在数据库中,并向用户显示完整的描述:
FRAME_AND_ALIGNMENT_CHOICES = [
("derailleur", "Align Derailleur Hanger"),
("clean", Basic Clean"),
("basket", "Install Front Basket"),
]
我正在使用 WizardView,其中第二个表单是:
FRAME_AND_ALIGNMENT_CHOICES = ["Align Derailleur Hanger", "Basic Clean",
"Install Front Basket"]
class RepairsForm(Form):
frame_and_alignment = forms.MultipleChoiceField(
choices=FRAME_AND_ALIGNMENT_CHOICES,
widget=forms.CheckboxSelectMultiple
)
我有一个像这样的 WizardView:
NEW_ORDER_TEMPLATES = {'0': 'app/create_customer.html', '1': 'app/repairs.html'}
class CustomerWizard(SessionWizardView):
def get_template_names(self):
return [NEW_ORDER_TEMPLATES[self.steps.current]]
def done(self, form_list, **kwargs):
customer_id = process_customer(form_list[0])
process_repairs(form_list[1], customer_id)
return HttpResponseRedirect(reverse('app:index'))
最后,这是我的第二种形式的模板:
<form action="" method="post">
{% csrf_token %}
{{ wizard.management_form }}
{{ wizard.form.frame_and_alignment }}
{# {{ wizard.form.as_p }}#}
<input type="submit" value="Save" />
</form>
表单的第一页填写得很好,但是当我点击提交以继续使用此模板和表单时,我在语句 {{ wizard.form.frame_and_alignment }}
上收到一个 ValueError,内容为 "too many values to unpack (expected 2)"。我的猜测是它与 MultipleChoiceField 或其他东西有关。
编辑这是回溯
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/create_order/
Django Version: 1.7.2
Python Version: 3.4.2
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.formtools',
'app')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Template error:
In template /Users/johnking/workspace/rice-bikes/app/templates/app/repairs.html, error at line 10
too many values to unpack (expected 2)
1 : {% extends "app/base.html" %}
2 :
3 : {% block content %}
4 :
5 : {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
6 :
7 : <form action="" method="post">
8 : {% csrf_token %}
9 : {{ wizard.management_form }}
10 : {{ wizard.form.frame_and_alignment }}
11 : {# {{ wizard.form.as_p }}#}
12 : <input type="submit" value="Save" />
13 : </form>
14 :
15 :
16 : {% endblock %}
Traceback:
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
137. response = response.render()
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/response.py" in render
103. self.content = self.rendered_content
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/response.py" in rendered_content
80. content = template.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in render
148. return self._render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/loader_tags.py" in render
126. return compiled_parent._render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/loader_tags.py" in render
65. result = block.nodelist.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/template/debug.py" in render
93. output = force_text(output)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/utils/encoding.py" in force_text
83. s = six.text_type(s)
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/forms/forms.py" in __str__
508. return self.as_widget()
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/forms/forms.py" in as_widget
560. return force_text(widget.render(name, self.value(), attrs=attrs))
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/forms/widgets.py" in render
739. return self.get_renderer(name, value, attrs, choices).render()
File "/Users/johnking/workspace/rice-bikes/py3env/lib/python3.4/site-packages/django/forms/widgets.py" in render
687. choice_value, choice_label = choice
Exception Type: ValueError at /create_order/
Exception Value: too many values to unpack (expected 2)
您的 choices
应该是两个项目的可迭代列表。
您可以执行以下任一操作:
FRAME_AND_ALIGNMENT_CHOICES = [
("Align Derailleur Hanger", "Align Derailleur Hanger")
("Basic Clean", "Basic Clean"),
("Install Front Basket", "Install Front Basket"),
]
或者使用列表理解来减少重复:
FRAME_AND_ALIGNMENT_CHOICES = [(c, c) for c in ["Align Derailleur Hanger", "Basic Clean", "Install Front Basket"]]
或者,您可能希望将代码存储在数据库中,并向用户显示完整的描述:
FRAME_AND_ALIGNMENT_CHOICES = [
("derailleur", "Align Derailleur Hanger"),
("clean", Basic Clean"),
("basket", "Install Front Basket"),
]