我正在尝试保存一个formset,但我一直在
string labelledshape
list_ = super(MultiValueDict, self).__getitem__(key)
KeyError: 'form-0-id'
During handling of the above exception, another exception occurred:
...
django.utils.datastructures.MultiValueDictKeyError: "'form-0-id'"
引发了同样的错误。
Here's a question似乎非常接近,但在modelformset.forms
之前添加{{form.id}}
似乎没有帮助。
数据库表中有一个自动生成的{%for field in form.visible_fields %}
字段,但未在模型中明确指定(不确定是否相关)。 id
未出现在任何表单代码或字段或模型代码中。 id
只是id
自动生成的数据库列。
以下是我发布的视图:
views.py
migrate
forms.py
def list_page(request, list_id):
image_path = get_image_path(list_id)
ordered_men = OrderedTable.objects.filter(list_id=list_id)
ordered_men = list(enumerate(
sorted(ordered_men, key=str)
))
print(f'there are {len(ordered_men)} men')
OrderedManInputFormSet = modelformset_factory(
OrderedManInput,
fields=fields,
form=OrderedManInputForm, extra=0)
ordered_man_input_formset = OrderedManInputFormSet(
form_kwargs={
'choices': ordered_men,
}
)
return render(
request, 'collector/list.html',
{
'list_id': list_id,
'image_path': image_path,
'formset': ordered_man_input_formset,
}
)
def submit(request, list_id):
OrderedManInputFormSet = modelformset_factory(
OrderedManInput,
form=OrderedManInputForm,
fields=fields,
extra=0,
)
modelformset = OrderedManInputFormSet(request.POST)
print('testing validity')
if modelformset.is_valid():
print('saving')
modelformset.save()
return HttpResponseRedirect(
reverse('collector:thanks')
)
def thanks(request):
return render(request, 'collector/thanks.html')
这是发布帖子的模板:
class OrderedManInputForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(OrderedManInputForm, self).__init__(args, kwargs)
if 'choices'in kwargs:
# This works
self.fields['full_name'] = forms.ChoiceField(
choices=[('', ' ')] + kwargs['choices'],
required=False
)
class Meta:
model = OrderedManInput
widgets = {}
text_fields = [
...
]
boolean_fields = [
...
]
widgets.update({
field: forms.TextInput()
for field in text_fields
})
widgets.update({
field: forms.CheckboxInput()
for field in boolean_fields
})
fields = text_fields + boolean_fields
labels = {
...
}
所以每行都是一个表单,每列都是一个字段:
回溯:
<form action="{% url 'collector:submit' list_id %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ formset.management_form }}
<table id="id_data_table">
{% for form in formset %}
{{form.id}}
{% if forloop.first %}
<thead><tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr></thead>
{% endif %}
<tr>
{%for field in form.visible_fields %}
<td>
{{field}}
</td>
{%endfor%}
</tr>
{% endfor %}
</table>
<p/>
<div class="div-submit">
<input type="submit"/>
</div>
</form>
[03/Sep/2017 00:08:21] "GET /collector/183618 HTTP/1.1" 200 20455
[03/Sep/2017 00:08:21] "GET /static/style.css HTTP/1.1" 200 1123
[03/Sep/2017 00:08:21] "GET /static/admin/js/vendor/jquery/jquery.js HTTP/1.1" 200 258648
[03/Sep/2017 00:08:21] "GET /static/lists_of_men_cropped/41550_1821100522_1170-01047.jpg HTTP/1.1" 404 1769
[03/Sep/2017 00:08:21] "GET /static/lists_of_men_cropped/41550_1821100522_1170-01047.jpg HTTP/1.1" 404 1769
Not Found: /favicon.ico
[03/Sep/2017 00:08:21] "GET /favicon.ico HTTP/1.1" 404 2078
testing validity
Internal Server Error: /collector/183618/submit/
Traceback (most recent call last):
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/utils/datastructures.py", line 83, in __getitem__
list_ = super(MultiValueDict, self).__getitem__(key)
KeyError: 'form-0-id'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/user/Documents/site/crowdsource/collector/views.py", line 87, in submit
if modelformset.is_valid():
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 321, in is_valid
self.errors
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 295, in errors
self.full_clean()
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 344, in full_clean
form = self.forms[i]
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 144, in forms
for i in range(self.total_form_count())]
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/formsets.py", line 144, in <listcomp>
for i in range(self.total_form_count())]
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/forms/models.py", line 603, in _construct_form
pk = self.data[pk_key]
File "/home/user/Documents/site/venv/lib/python3.6/site-packages/django/utils/datastructures.py", line 85, in __getitem__
raise MultiValueDictKeyError(repr(key))
django.utils.datastructures.MultiValueDictKeyError: "'form-0-id'"
[03/Sep/2017 00:09:02] "POST /collector/183618/submit/ HTTP/1.1" 500 112006
来自于我在回复下面提出的答案时添加的内容。
testing validity
在Chrome中查看来源(匿名字段名称;其中没有一个是print('testing validity')
if modelformset.is_valid():
print('saving')
modelformset.save()
):
id
答案 0 :(得分:0)
我认为您必须在保存表单集之前调用<script>
setTimeout(function() {
document.getElementsByClassName('playerButton play')[0].click();
}, 5000);
</script>
,即使您100%确定表单有效:
is_valid