当使用外键链接保存modelForms时,Django'ManagementForm数据丢失或被篡改 [英] Django 'ManagementForm data is missing or has been tampered with' when saving modelForms with foreign key link

查看:130
本文介绍了当使用外键链接保存modelForms时,Django'ManagementForm数据丢失或被篡改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Django很新,所以这可能是一个容易的问题。我有两个modelForms,其中有一个ForeignKey到另一个。我的主要目标是将指标与疾病(FK)联系起来,使得对于特定的疾病,您可以有多个指标。



使用下面的代码,当我点击提交管理窗体数据丢失或被篡改时,我收到错误。此外,views.py中的代码似乎没有在第三个'if'语句中返回HttpResponseRedirect的验证。但是,当我检查我的数据库时,表单中的值已写入。任何关于为什么错误提出的想法?如何修复?



我的代码如下:



models.py

  #Table for Disease 
class疾病(models.Model):
disease = models.CharField(max_length = 300)

#Tables for Indicators
class指标(models.Model):
relateddisease = models.ForeignKey(疾病)
指标= models.CharField(max_length = 300)

forms.py

  class DiseaseForm(forms.ModelForm):
class Meta:
model = Disease

class IndicatorForm(forms.ModelForm):
class Meta:
model = Indicator

疾病框架= inlineformset_factory(疾病,
指标,
can_delete = False,
form =疾病模式)

views.py

  def drui (请求):

如果request.method ==POST:

indicatorForm = IndicatorForm(request.POST)

如果indicatorForm.is_valid():
new_indicator = indicatorForm.save()
diseaseInlineFormSet = DiseaseFormSet(request.POST,request.FILES,instance = new_indicator)

如果diseaseInlineFormSet.is_valid ():
diseaseInlineFormset.save()
返回HttpResponseRedirect('some_url.html')

其他:
指标符号= IndicatorForm()
diseaseInlineFormSet = DiseaseFormSet()

返回render_to_response(drui.html,{'indicatorForm':indicatorForm,'diseaseInlineFormSet':diseaseInlineFormSet},context_instance = RequestContext(request))

template.html

 < form class =disease_formaction ={%url drui%}method =post> {%csrf_token%} 
{{indicatorForm.as_table}}
< input type =submit name =submitvalue =Submitclass =button>
< / form>


解决方案

你没有 diseaseFormSet diseaseFormSet 的管理表单,但您尝试实例化表单集。表单需要隐藏的管理表单,告诉django该集合中有多少个表单。



将其插入到HTML

  {{diseaseFormSet.as_table}} 
{{diseaseFormSet.management_form}}


I am rather new to Django so this may be an easy question. I have 2 modelForms where there is a ForeignKey to another. My main goal is to save Indicators with a link to Disease (FK), such that for a particular disease, you can have multiple indicators.

With the code below, I get an error when I hit submit that says 'ManagementForm data is missing or has been tampered with'. Also, the code in views.py does not seem to be validating at the 3rd 'if' statement where there is a return HttpResponseRedirect. However, when I check my database, the values from the form have been written. Any ideas on why the error has been raised? and how to fix it?

My code is below:

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))   

template.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>

解决方案

You have neither diseaseFormSet nor diseaseFormSet's management form in your template, yet you try to instantiate the formset. Formsets require the hidden management form which tells django how many forms are in the set.

Insert this into your HTML

{{ diseaseFormSet.as_table }} 
{{ diseaseFormSet.management_form }}

这篇关于当使用外键链接保存modelForms时,Django'ManagementForm数据丢失或被篡改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆