gpt4 book ai didi

python - Django:缺少 ManagementForm 数据...Formset 将无法验证。为什么?

转载 作者:太空狗 更新时间:2023-10-30 02:14:01 25 4
gpt4 key购买 nike

出于某种原因,我的表单集在提交后无法验证。关于这可能发生的方式有什么想法吗?

#模型.py
class Department(models.Model):
department = models.CharField(verbose_name = "Department Name", max_length=100)
description = models.TextField(verbose_name = "Description", blank=True, null=True)
sp_description = models.TextField(verbose_name = "Description (Spanish)", blank=True, null=True)
phone = PhoneNumberField()
phone_ext = models.CharField(max_length=10, blank=True)

#Relations
provider = models.ForeignKey(Provider, blank=True, null=True)
services_offered = models.ManyToManyField(ServiceType)

def __unicode__(self):
return self.department

#view.py
def display_step5(request):
msg = ''
email = request.session.get('email')
provider_obj = retrieve_provider_instance(email)
AddDepartmentFormSet = inlineformset_factory(Provider, Department, extra=0)
if is_authenticated(request):
AddDepartmentFormSet = inlineformset_factory(Provider, Department, extra=0)
if request.method=='POST':
if 'add_department' in request.POST:
cp = request.POST.copy()
cp['department-TOTAL_FORMS'] = int(cp['department-TOTAL_FORMS'])+ 1
new_department = AddDepartmentFormSet(cp, prefix='department', instance=provider_obj)
elif 'submit' in request.POST:
formset = AddDepartmentFormSet(request.POST, instance=provider_obj)
instances = formset.save(commit=False)
for instance in instances:
instance.provider = provider_obj
instance.save()
return HttpResponse("Departments have been added")
else:
new_department = AddDepartmentFormSet(prefix='department', instance=provider_obj)

else:
return HttpResponseRedirect(reverse('health.register.views.display_auth'))
return render_to_response('step5-test.html',
{'department': new_department}, context_instance=RequestContext(request))

step5-test.html

<form method='post' action='{{request.path}}'>{% csrf_token %}
<fieldset>
<legend>Departments</legend>
{{ department.management_form }}
{% for form in department.forms %}
<HR> <div><table>{{form.as_table}}</table></div>
{% endfor %}
<BR/>
<input title='Add a new department' type='submit' name='add_department' value='Add-Another-Department' />
</fieldset>
<BR/><BR/>
<input title='Submit this form' type='submit' name='submit' value='Submit' />
</form>

跟进(解决方案):

Brant 提供了一些关于错误发生原因的见解。就我而言,他的洞察力帮助我构建了一个更适合我的情况的 hack。此 hack 似乎适用于可能已在模板中以某种方式修改的表单集。就我而言,我的表单集变得复杂并且需要一些 ajax 来使其更加用户友好。

“retrieve_provider_instance(email)”是一种根据数据库中设置的各种条件动态检索提供者对象的方法(大约 200 行代码)。

经过大量调试后,以下 hack 对我有用。我通过在模板的“for”循环中添加以下隐藏字段解决了这个问题

{% {for form in formset.forms %}
<tr>
<td>
{% if form.instance.pk %} <!--- if instance already exists on db --->
{{ form.DELETE }}
<input type='hidden' name="department_set-{{ forloop.counter0 }}-id" id="id_department_set-{{ forloop.counter0 }}-id" value={{ form.instance.pk }} />
{% endif %}
Name: <br/> {{ form.department}} <br/>
Phone Number: <br/> {{ form.phone }} <br/>
Phone Ext: <br/> {{ form.phone_ext }}</td>
<td>Description: <br/> {{ form.description }}</td>
<td>Description (Spanish): <br/> {{ form.sp_description }}</td>
<td>Services Provided: <br/> {{ form.services_offered }}</td>
<td></td>
</tr>
{% endfor %}

我接受了 Mark 的回答,因为它更适用于我提出的具体问题。希望这对将来尝试实现此示例的其他用户有所帮助。事实上,在提交时分配“前缀”是正确的方法,也是最有意义的。

感谢您的所有回复。

最好的问候,马特


跟进:我想我可能已经找到了部分问题。但是,还没有解决。

以下是一些可能有助于解决问题的附加信息。 不正确的 POST 数据会把事情搞砸吗?如果是这样,我该如何解决这个问题?

这是我提交表单集后发生的情况(在本例中只有一个表单):

回溯如下:

File "/home/mhjohnson/webapps/resourcedb/lib/python2.6/django/forms/formsets.py" in _management_form 68. raise ValidationError('ManagementForm data is missing or has been tampered with')

这是我的 POST 数据:

department-0-phone_ext -----> u'222'

department-0-id -----> u''

department-0-services_offered -----> u'2'

department-0-phone -----> u'222-222-2222'

department-INITIAL_FORMS -----> u'0'

submit -----> u'Submit'

department-MAX_NUM_FORMS -----> u''

department-0-department -----> u'Test 1'

department-0-provider -----> u''

department-TOTAL_FORMS -----> u'1'

csrfmiddlewaretoken -----> u'92a39322b16ed7e5e10dbd6c5ac64bf4'

department-0-description -----> u'Blah blah'

department-0-sp_description -----> u'....'

有什么想法吗?

最佳答案

你的问题在这里:

       if request.method=='POST':
if 'add_department' in request.POST:
cp = request.POST.copy()
cp['department-TOTAL_FORMS'] = int(cp['department-TOTAL_FORMS'])+ 1
new_department = AddDepartmentFormSet(cp, prefix='department', instance=provider_obj)
elif 'submit' in request.POST:
formset = AddDepartmentFormSet(request.POST, instance=provider_obj)
instances = formset.save(commit=False)
for instance in instances:
instance.provider = provider_obj
instance.save()
return HttpResponse("Departments have been added")
else:
new_department = AddDepartmentFormSet(prefix='department', instance=provider_obj)

如果没有 POST,则传递前缀“department”。如果“add_department”在 POST 中,则传递“department”前缀。但是,当“提交”在 POST 中时,您不会传递前缀。没有前缀,表单集无法在 POST 中找到正确的数据。

关于python - Django:缺少 ManagementForm 数据...Formset 将无法验证。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4638693/

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