django - /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 -->
解决方案
当您手动呈现表单集时,您必须包含所有字段,包括隐藏的字段。
您可以使用此 for 循环来获取所有这些
{% for form in formset %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
... include the rest of your form fields ...
{% endfor %}
推荐阅读
- testing - 如何使用 jest 测试 iFrame 的内容
- android - 数据库不更新
- javascript - 哪些 js Charts 提供了关于数据的动态图表
- sql - 在单引号中使用 'like' 时出现 Postgres 语法错误
- java - httpclient 连接重置
- sql - 我们如何获得当前 24 小时的最新记录,其他留下以下所有记录
- javascript - 哪个是使用部分标签的好概念?
- javascript - 赛普拉斯测试表单
- javascript - TypeError: routingState.equals 不是函数 | 笑话测试用例
- java - Log4J 正在控制台中创建递增的日志