使用外键链接保存模型表单时,Django 'ManagementForm 数据丢失或已被篡改'
Posted
技术标签:
【中文标题】使用外键链接保存模型表单时,Django \'ManagementForm 数据丢失或已被篡改\'【英文标题】:Django 'ManagementForm data is missing or has been tampered with' when saving modelForms with foreign key link使用外键链接保存模型表单时,Django 'ManagementForm 数据丢失或已被篡改' 【发布时间】:2013-08-04 01:44:07 【问题描述】:我对 Django 比较陌生,所以这可能是一个简单的问题。我有 2 个 modelForms,其中有一个 ForeignKey。我的主要目标是保存带有疾病 (FK) 链接的指标,这样对于特定疾病,您可以拥有多个指标。
使用下面的代码,当我点击提交时出现错误,提示“ManagementForm 数据丢失或已被篡改”。此外,views.py 中的代码似乎没有在第三个“if”语句中进行验证,其中有一个返回 HttpResponseRedirect。但是,当我检查我的数据库时,表单中的值已被写入。关于为什么提出错误的任何想法?以及如何解决?
我的代码如下:
models.py
#Table for Disease
class Disease(models.Model):
disease = models.CharField(max_length=300)
#Tables for Indicators
class Indicator(models.Model):
relevantdisease = models.ForeignKey(Disease)
indicator = models.CharField(max_length=300)
forms.py
class DiseaseForm(forms.ModelForm):
class Meta:
model = Disease
class IndicatorForm(forms.ModelForm):
class Meta:
model = Indicator
DiseaseFormSet = inlineformset_factory(Disease,
Indicator,
can_delete=False,
form=DiseaseForm)
views.py
def drui(request):
if request.method == "POST":
indicatorForm = IndicatorForm(request.POST)
if indicatorForm.is_valid():
new_indicator = indicatorForm.save()
diseaseInlineFormSet = DiseaseFormSet(request.POST, request.FILES, instance=new_indicator)
if diseaseInlineFormSet.is_valid():
diseaseInlineFormset.save()
return HttpResponseRedirect('some_url.html')
else:
indicatorForm = IndicatorForm()
diseaseInlineFormSet = DiseaseFormSet()
return render_to_response("drui.html", 'indicatorForm': indicatorForm, 'diseaseInlineFormSet': diseaseInlineFormSet,context_instance=RequestContext(request))
模板.html
<form class="disease_form" action="% url drui %" method="post">% csrf_token %
indicatorForm.as_table
<input type="submit" name="submit" value="Submit" class="button">
</form>
【问题讨论】:
见docs.djangoproject.com/en/stable/topics/forms/formsets/…。 【参考方案1】:您的模板中既没有diseaseFormSet
也没有diseaseFormSet
的管理表单,但您尝试实例化表单集。表单集需要隐藏的管理表单,它告诉 django 集合中有多少表单。
将其插入到您的 HTML 中
diseaseFormSet.as_table
diseaseFormSet.management_form
【讨论】:
我仍然遇到同样的错误。如果我取出 indicatorForm.as_table 并添加上面的 2 行,我的表单将显示为完全空白。当我保留 indicatorForm.as_table 并将您的 2 行添加到 indicatorForm 上方时,我的表单会显示,但会引发“管理数据丢失错误”。 实际上,我假设您的意思是 diseaseInlineFormSet.management_form,因为我将其传递给 render_to_response。现在我的错误是“未定义全局名称'diseaseInlineFormset'”。我不确定我应该在哪里定义这个变量... 玩得更多!有用。我的 view.py 中有一个错字,应该说 diseaseInlineFormSet 而不是 diseaseInLineFormset。此外,传递 diseaseInlineFormSet.management_form 是真正的问题。谢谢! 我正在与类似的事情作斗争——我正在阅读这个问题,在我看来,这将产生一个指标和许多疾病。我完全倒退了吗?以上是关于使用外键链接保存模型表单时,Django 'ManagementForm 数据丢失或已被篡改'的主要内容,如果未能解决你的问题,请参考以下文章