gpt4 book ai didi

Django 管理表单失败,因为 'form-TOTAL_FORMS' 和 'form-INITIAL_FORMS' 未正确填充

转载 作者:行者123 更新时间:2023-12-04 00:42:23 26 4
gpt4 key购买 nike

信息:

我想创建嵌套表单,最好通过以下位置提供的示例进行描述:

http://yergler.net/blog/2009/09/27/nested-formsets-with-django/

此页面上的教程似乎相当不错 && 它正在尝试解决我遇到的确切问题。

当没有 POST 请求数据时(即我们正在从数据库执行初始填充),views.py 文件中的此实现似乎存在问题。

代码可以在上面提供的 URL 中看到(如果需要我可以发布一些代码,但我担心它会带走这里提供的信息)。

这是失败的 views.py 代码(粗体):

block = get_object_or_404(models.Block, id=block_id)

if request.method == 'POST':
formset = forms.BuildingFormset(request.POST, instance=block)

if formset.is_valid():
rooms = formset.save_all()

return redirect('block_view', block_id=block.id)

else:
formset = forms.BuildingFormset(instance=block) #This is the line that is throwing the ValidationError

我得到的错误信息是:

ValidationError at "urlName":
[u'ManagementForm data is missing or has been tampered with']

我已经深入挖掘,看来这个失败发生在 site-packages/django/forms/formsets.py 行

is_valid() 检查失败,因为一些管理表单所需的数据(form-TOTAL_FORMS、form-INITIAL_FORMS 和 form-MAX_NUM_FORMS)无效。以下是 self.errors 的实际输出:

{u'TOTAL_FORMS': [u'This field is required.'], u'INITIAL_FORMS': [u'This field is required.']}

代码:

edit_building.html:

{{ buildings.management_form }}

{% for building in buildings.forms %}

 {{ building }}

{% if building.nested %}
{% for formset in building.nested %}
{{ formset.as_table }}
{% endfor %}
{% endif %}

{% endfor %}

views.py:

def should_delete(self, form):
"""Convenience method for determining if the form’s object will
be deleted; cribbed from BaseModelFormSet.save_existing_objects."""

if self.can_delete:
raw_delete_value = form._raw_value(DELETION_FIELD_NAME)
should_delete = form.fields[DELETION_FIELD_NAME].clean(raw_delete_value)
return should_delete

return False

def save_all(self, commit=True):
"""Save all formsets and along with their nested formsets."""

# Save without committing (so self.saved_forms is populated)
# — We need self.saved_forms so we can go back and access
# the nested formsets
objects = self.save(commit=False)

# Save each instance if commit=True
if commit:
for o in objects:
o.save()

# save many to many fields if needed
if not commit:
self.save_m2m()

# save the nested formsets
for form in set(self.initial_forms + self.saved_forms):
if self.should_delete(form): continue

for nested in form.nested:
nested.save(commit=commit)

表单.py:

def should_delete(self, form):
"""Convenience method for determining if the form’s object will
be deleted; cribbed from BaseModelFormSet.save_existing_objects."""

if self.can_delete:
raw_delete_value = form._raw_value(DELETION_FIELD_NAME)
should_delete = form.fields[DELETION_FIELD_NAME].clean(raw_delete_value)
return should_delete

return False

def save_all(self, commit=True):
"""Save all formsets and along with their nested formsets."""

# Save without committing (so self.saved_forms is populated)
# — We need self.saved_forms so we can go back and access
# the nested formsets
objects = self.save(commit=False)

# Save each instance if commit=True
if commit:
for o in objects:
o.save()

# save many to many fields if needed
if not commit:
self.save_m2m()

# save the nested formsets
for form in set(self.initial_forms + self.saved_forms):
if self.should_delete(form): continue

for nested in form.nested:
nested.save(commit=commit)

注意事项:

问题:

在没有POST数据的情况下,如果只从数据库生成表单,应该如何正确填写'form-TOTAL_FORMS' && 'form-INITIAL_FORMS'数据来解决这个问题?

最佳答案

更新:

看完the example您在 add_fields() 方法末尾的 forms.py 中提供了这样一段代码:

# store the formset in the .nested property
form.nested = [
TenantFormset(data = self.data,
instance = instance,
prefix = 'TENANTS_%s' % pk_value)
]

data 参数引起了问题,因为它最初是空的,并且 Django 内部将确定表单是否为 is bound。通过类似于此的条件:

self.is_bound = data is not None

# Example
>>> my_data = {}
>>> my_data is not None
True

正如您所见,Python 中的空字典不是 None,因此您的 TenantFormset 被视为 bound 表单,即使它不是。您可以使用以下内容修复它:

# store the formset in the .nested property
form.nested = [
TenantFormset(data = self.data if any(self.data) else None,
instance = instance,
prefix = 'TENANTS_%s' % pk_value)
]

您可以发布 View 和表单代码以及表单的模板代码吗?

我的猜测是您没有在模板中使用“management_form”(它添加了您缺少的“form-TOTAL_FORMS”和“form-INITIAL_FORMS”字段),即

<form method="post">
{{ formset.management_form }}
<table>
{% for form in formset %}
{{ form }}
{% endfor %}
</table>
</form>

关于Django 管理表单失败,因为 'form-TOTAL_FORMS' 和 'form-INITIAL_FORMS' 未正确填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17518018/

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