添加表单字段时Django值错误

时间:2015-08-05 20:55:18

标签: python django forms

我正在动态创建一些表单字段,如此问题所示:

Passing data into django forms

形式:

class DispatchForm(forms.Form):
driver = forms.MultipleChoiceField(choices=[])
route = forms.MultipleChoiceField(choices=[])
states = forms.CharField()

def __init__(self, *args, **kwargs):
    DRIVER_CHOICES = [[driver, driver] for driver in self.extract_drivers(args[0])]
    ROUTE_CHOICES = [[route, route] for route in args[1]]
    super(DispatchForm, self).__init__(*args, **kwargs)
    self.fields['driver'].choices = DRIVER_CHOICES
    self.fields['route'].choices = ROUTE_CHOICES

模板:

<div class="form-group">
                            <label class="col-lg-12" for="route">Ruta</label>
                            <select class="form-control" id="route">
                                {% for value, input in form.route.field.choices %}
                                    <option value="{{ value }}">{{ input }}</option>
                                {% endfor %}
                            </select>
                            <label class="col-lg-12" for="state">Estado</label>
                         <label class="col-lg-12" for="driver">Conductor</label>
                            <select class="form-control" id="driver">
                                {% for value, input in form.driver.field.choices %}
                                    <option value="{{ value }}">{{ input }}</option>
                                {% endfor %}
                            </select>
                        {{ form.states }}
                        </div>

视图

def dashboard(request):
template_name = 'dashboard.html'
drivers = Driver.objects.using('routes').all()
routes = RouteManager().extract_routes()
form = DispatchForm(drivers, routes)
return render(request, template_name, {
    'form': form,
})

但无论我尝试添加到表单中的新字段,都会给我一个&#34;太多的值来解包(预期2)&#34;

在这种情况下,它告诉我错误在{{form.states}}。我怀疑它与我修改的表单init方法有关,但我尝试的所有内容都会引发同样的错误。

谢谢!

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/dashboard/

Django Version: 1.8.3
Python Version: 3.4.0
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'web_server',
 'widget_tweaks',
 'datetimewidget')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.RemoteUserBackend',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')


Template error:
In template /home/carlos/smart/SMWEB-CANOPUS/web_server/templates/dashboard.html, error at line 111
   too many values to unpack (expected 2)

   101 :                                         <option value="{{ value }}">{{ input }}</option>



   102 :                                     {% endfor %}



   103 :                                 </select>



   104 :                                 <label class="col-lg-12" for="state">Estado</label>



   105 :                              <label class="col-lg-12" for="driver">Conductor</label>



   106 :                                 <select class="form-control" id="driver">



   107 :                                     {% for value, input in form.driver.field.choices %}



   108 :                                         <option value="{{ value }}">{{ input }}</option>



   109 :                                     {% endfor %}



   110 :                                 </select>



   111 :                              {{ form.states }} 



   112 :                             </div>



   113 :                     </div>



   114 :            </div>



   115 :             </div>



   116 :        </section><! --/wrapper -->



   117 :       </section><!-- /MAIN CONTENT -->



   118 : 



   119 :       <!--main content end-->



   120 :       <!--footer start-->



   121 :       <footer class="site-footer">


Traceback:
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/carlos/smart/SMWEB-CANOPUS/web_server/views.py" in dashboard
  42.         'form': form,
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/shortcuts.py" in render
  67.             template_name, context, request=request, using=using)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/template/loader.py" in render_to_string
  99.         return template.render(context, request)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/template/backends/django.py" in render
  74.         return self.template.render(context)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/template/base.py" in render
  209.                     return self._render(context)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/template/base.py" in _render
  201.         return self.nodelist.render(context)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/template/debug.py" in render
  92.             output = force_text(output)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/utils/encoding.py" in force_text
  90.                     s = six.text_type(s)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/utils/html.py" in <lambda>
  399.         klass.__str__ = lambda self: mark_safe(klass_str(self))
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/forms/forms.py" in __str__
  537.         return self.as_widget()
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/forms/forms.py" in as_widget
  593.         return force_text(widget.render(name, self.value(), attrs=attrs))
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/forms/forms.py" in value
  638.                 self.data, self.form.initial.get(self.name, self.field.initial)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/forms/forms.py" in data
  616.         return self.field.widget.value_from_datadict(self.form.data, self.form.files, self.html_name)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/forms/widgets.py" in value_from_datadict
  223.         return data.get(name, None)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/db/models/query.py" in get
  325.         clone = self.filter(*args, **kwargs)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/db/models/query.py" in filter
  679.         return self._filter_or_exclude(False, *args, **kwargs)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/db/models/query.py" in _filter_or_exclude
  697.             clone.query.add_q(Q(*args, **kwargs))
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/db/models/sql/query.py" in add_q
  1309.         clause, require_inner = self._add_q(where_part, self.used_aliases)
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/db/models/sql/query.py" in _add_q
  1337.                     allow_joins=allow_joins, split_subq=split_subq,
File "/home/carlos/SMARtenv/lib/python3.4/site-packages/django/db/models/sql/query.py" in build_filter
  1146.         arg, value = filter_expr

Exception Type: ValueError at /dashboard/
Exception Value: too many values to unpack (expected 2)

错误:

Error during template rendering

In template /home/carlos/smart/SMWEB-CANOPUS/web_server/templates/dashboard.html, error at line 111
too many values to unpack (expected 2)
101                                         <option value="{{ value }}">{{ input }}</option>
102                                     {% endfor %}
103                                 </select>
104                                 <label class="col-lg-12" for="state">Estado</label>
105                              <label class="col-lg-12" for="driver">Conductor</label>
106                                 <select class="form-control" id="driver">
107                                     {% for value, input in form.driver.field.choices %}
108                                         <option value="{{ value }}">{{ input }}</option>
109                                     {% endfor %}
110                                 </select>
111 

      {{ form.states }}



112                             </div>
113                     </div>
114             </div>
115             </div>
116         </section><! --/wrapper -->
117       </section><!-- /MAIN CONTENT -->
118 
119       <!--main content end-->
120       <!--footer start-->
121       <footer class="site-footer">

1 个答案:

答案 0 :(得分:0)

想想我发现了问题,我将* args和** kwargs传递给了构造函数,但是当我改变了这个问题时:

def __init__(self, *args, **kwargs):
DRIVER_CHOICES = [[driver, driver] for driver in self.extract_drivers(args[0])]
ROUTE_CHOICES = [[route, route] for route in args[1]]
super(DispatchForm, self).__init__(*args, **kwargs)
self.fields['driver'].choices = DRIVER_CHOICES
self.fields['route'].choices = ROUTE_CHOICES

对此:

def __init__(self, drivers, routes, *args, **kwargs):
DRIVER_CHOICES = [[driver, driver] for driver in self.extract_drivers(drivers)]
ROUTE_CHOICES = [[route, route] for route in routes]
super(DispatchForm, self).__init__(*args, **kwargs)
self.fields['driver'].choices = DRIVER_CHOICES
self.fields['route'].choices = ROUTE_CHOICES

它按预期工作。