首页 > 解决方案 > /optin/amend-user-optins/1/“u'form-0-id'”处的 MultiValueDictKeyError

问题描述

我有这个UpdateView,当我GET工作正常时,当我POST保存表单集数据但打开模板时出错。

这是视图:

class UpdateUserOptinView(LoginRequiredMixin, UpdateView):
    form_class = UserForm
    model = USER_MODEL
    template_name = 'optin/optin_form.html'

    def get_context_data(self, **kwargs):
        data = super(UpdateUserOptinView, self).get_context_data(**kwargs)

        # ensure we have an option for each Category
        categories = Category.objects.all()

        for category in categories:
            opt, created = UserOptin.objects.get_or_create(user=USER_MODEL.objects.get(pk=self.kwargs['pk']), category=category)
            if created: opt.save()

        qs = UserOptin.objects.filter(user=USER_MODEL.objects.get(pk=self.kwargs['pk']))

        # create the formset
        if self.request.POST:
            data['formset'] = UserOptinFormSet(self.request.POST)
        else:
            data['formset'] = UserOptinFormSet(queryset=qs)
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        formset = context['formset']
        if formset.is_valid():
            formset.save()
        return super(UpdateUserOptinView, self).form_valid(form)

追溯:

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  217.                 response = self.process_exception_by_middleware(e, request)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  215.                 response = response.render()

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/response.py" in render
  107.             self.content = self.rendered_content

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/response.py" in rendered_content
  84.         content = template.render(context, self._request)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/backends/django.py" in render
  66.             return self.template.render(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  207.                     return self._render(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/base.py" in _render
  199.         return self.nodelist.render(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  177.             return compiled_parent._render(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/base.py" in _render
  199.         return self.nodelist.render(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  72.                 result = block.nodelist.render(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/base.py" in render
  990.                 bit = node.render_annotated(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  957.             return self.render(context)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  173.             len_values = len(values)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/forms/formsets.py" in __len__
  81.         return len(self.forms)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/utils/functional.py" in __get__
  35.         res = instance.__dict__[self.name] = self.func(instance)

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/forms/formsets.py" in forms
  144.                  for i in range(self.total_form_count())]

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/forms/models.py" in _construct_form
  608.             pk = self.data[pk_key]

File "/home/henry/Documents/Sites/Development/pickem/env/local/lib/python2.7/site-packages/django/utils/datastructures.py" in __getitem__
  85.             raise MultiValueDictKeyError(repr(key))

Exception Type: MultiValueDictKeyError at /optin/amend-user-optins/1/
Exception Value: "u'form-0-id'"

我也在 DEBUG 错误屏幕中给出了这个,但如果我删除 Google Tags 位,它只会提供不同的行号(通常为 0):

Template error:
In template /home/henry/Documents/Sites/Development/pickem/pickem/templates/base.html, error at line 14
   u'form-0-id'   4 : <html>
   5 : 
   6 : <head>
   7 :  <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
   8 :  <script>
   9 :    (adsbygoogle = window.adsbygoogle || []).push({
   10 :         google_ad_client: "ca-pub-1194245783458980",
   11 :         enable_page_level_ads: true
   12 :       });
   13 :     </script>
   14 :     <!-- Global site  tag (gtag.js) - Google A nalytics -->
   15 :     <script async src="https://www.googletagmanager.com/gtag/js?id=UA-109856785-1"></script>
   16 :     <script>
   17 :         window.dataLayer = window.dataLayer || [];
   18 :         function gtag(){dataLayer.push(arguments);}
   19 :         gtag('js', new Date());
   20 :     
   21 :         gtag('config', 'UA-XXXXXXXXX-1');
   22 :     </script>
   23 :     
   24 :     <!-- Google Tag Manager -->

标签: djangodjango-forms

解决方案


当您手动呈现表单集时,您必须包含所有字段,包括隐藏的字段。

您可以使用此 for 循环来获取所有这些

{% for form in formset %}
    {% for hidden in form.hidden_fields %}
        {{ hidden }}
    {% endfor %}
    ... include the rest of your form fields ...
{% endfor %}

推荐阅读