2015-02-08 33 views
0

我使用的是WizardView其中第二种形式是:Django的WizardView在表复选框使“ValueError异常值过多解压(预期2)”

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> 

形式的第一页填写OU很好,但是当我点击提交继续进行这个模板和表单时,我在{{ wizard.form.frame_and_alignment }}的语句上得到一个ValueError,其中显示“太多的值来解压缩(预期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) 
+0

你可以显示完整的回溯? – Alasdair 2015-02-08 08:33:50

+0

@Alasdair添加了追踪 – 2015-02-11 20:49:39

回答

1

choices应该是两个项目iteratables的列表。

你可以做两种:

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"), 
] 
+0

非常感谢!我发现Django的文档有点难以阅读。例如。我不能只查找CheckboxSelectMultiple,而是必须通读所有小部件的文档,例如它是一个教程。但无论如何,我看到它现在说的地方,我感谢你! – 2015-02-13 05:30:46

相关问题