gpt4 book ai didi

django - 如何在 Formset POST 上调试 Django MultiValueDictKeyError

转载 作者:行者123 更新时间:2023-12-03 14:30:22 30 4
gpt4 key购买 nike

当我发布我的表单集时,我得到一个 MultiValueDictKeyError。具体来说:

MultiValueDictKeyError at /core/customers/1/update/documents/
"Key u'documents-0-attachment_ptr' not found in <QueryDict: {u'documents-1-last_modified_date': [u''], u'documents-1-name': [u''], u'documents-MAX_NUM_FORMS': [u''], u'documents-0-attachment_file': [u''], u'documents-INITIAL_FORMS': [u'1'], u'documents-1-document_type': [u''], u'documents-0-notes': [u''], u'documents-1-notes': [u''], u'submit': [u'Submit changes'], u'documents-0-DELETE': [u'on'], u'documents-1-attachment_file': [u''], u'documents-0-document_type': [u''], u'documents-TOTAL_FORMS': [u'2'], u'documents-0-name': [u'test'], u'documents-1-creation_date': [u''], u'documents-0-creation_date': [u'2012-12-01 23:41:48'], u'csrfmiddlewaretoken': [u'NCQ15jA7erX5dAbx20Scr3gWxgaTn3Iq', u'NCQ15jA7erX5dAbx20Scr3gWxgaTn3Iq', u'NCQ15jA7erX5dAbx20Scr3gWxgaTn3Iq'], u'documents-0-last_modified_date': [u'2012-12-01 23:41:48']}>"

关键部分是 Django 正在寻找 key documents-0-attachment_ptr在帖子数据中。这很令人困惑——文档是附件的子类。所有其他帖子数据都符合预期。为什么 Django 在我的表单集中需要指针数据?

这是表单集中使用的表单:
class DocumentInlineForm(forms.ModelForm):  # pylint: disable=R0924
attachment_file = forms.FileField(widget=NoDirectoryClearableFileInput)
notes = forms.CharField(
required=False,
widget=forms.Textarea(attrs={'rows': 2,}),
)
helper = DocumentInlineFormHelper()

class Meta: # pylint: disable=W0232,R0903
fields = (
'attachment_file',
'creation_date',
'document_type',
'last_modified_date',
'name',
'notes',
)
model = Document

这是文档模型:
"""
Handles document model definitions.
"""
from django.db import models
from eee_core.models.attachments import Attachment
from django.db.models.signals import pre_save
from datetime import datetime
from django.utils.timezone import utc

class Document(Attachment):
"""
A document is an attachment with additional meta data.
"""
creation_date = models.DateTimeField(
blank=True,
null=True,
)
document_type = models.CharField(
blank=True,
choices=(
('CONTRACT', 'Contract'),
('INVOICE', 'Invoice'),
('FACILITY', 'Facility change form'),
('LOA', 'Letter of authorization'),
('USAGE', 'Usage history document'),
('OTHER', 'Other'),
),
default=None,
null=True,
max_length=8,
)
last_modified_date = models.DateTimeField(
blank=True,
null=True,
)
notes = models.TextField(
blank=True,
null=True,
)

class Meta(Attachment.Meta): # pylint: disable=W0232,R0903
"""
Sets meta fields for model.
"""
app_label = 'core'

def __str__(self):
return unicode(self).encode('utf-8')

def __unicode__(self):
return unicode(self.name)

def pre_save_callback(sender, instance, *args, **kwargs): # pylint: disable=W0613
if not isinstance(instance, Document):
return

if not instance.creation_date:
instance.creation_date = datetime.utcnow().replace(tzinfo=utc)

instance.last_modified_date = datetime.utcnow().replace(tzinfo=utc)

pre_save.connect(pre_save_callback, dispatch_uid='document_pre_save')

附加信息:

奇怪的是,表单集的初始帖子工作正常。只有在更新帖子上——当表单集中有初始表单时——当我收到这个错误时。当我尝试从表单集中删除表单时也会发生这种情况。

此外,该表单集是使用 django 脆表单的通用内联表单集。

更新

有一个使用模板代码的请求。这是简化版:
{% load crispy_forms_tags %}
{% load url from future %}
<form action="" method="post" enctype="multipart/form-data">
{{ formset.management_form }}
{% for subform in formset.forms %}
{{ subform.id }}
{% crispy subform %}
{% endfor %}
<div class="btn-toolbar">
<input class='btn btn-primary' type="submit" name="submit" value="Submit changes" />
</div>
</form>

最佳答案

OP 不是这种情况,但您会遇到 MultiValueDictKeyError ,如果模板中缺少某些隐藏字段。它可能会发生而不是快速和肮脏{{form}} ,字段在模板中一一列出:{{form.field1}} , {{form.field2}} ,同时省略所需的隐藏字段。

要将它们包含回来,请按照以下方式进行操作(对于表单集中的每个表单/表单):

{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}

或者
{% for form in formset %}    
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endfor %}

关于django - 如何在 Formset POST 上调试 Django MultiValueDictKeyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13666852/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com