Skip to main content
 首页 » 编程设计

python之如何在 Django 模型表单中保存外键

2024年08月13日48mate10pro

我有两个模型和一个表单和一个表单集,所以表单集包含表单的外部内容,我想在保存表单和表单集时将添加的 ID 保存到表单集。

模型.py

class fmodel(models.Model): 
   name=models.TextField(blank=True,null=True) 
 
class smodel(models.Model): 
   desc=models.TextField(blank=True,null=True) 
   n=models.ForeignKey(fmodel,null=True,blank=True,related_name='somemodel') 

表单.py

class fmodelForm(forms.ModelForm): 
   name=forms.CharField(max_length=200,widget=forms.TextInput(attrs={'class': 'form-control'})) 
    class Meta: 
         model=fmodel 
         fields=['name'] 
 
smodelFormset=modelformset_factory( 
  smodel, 
  fields=('desc',), 
  extra=1, 
  widgets={ 
      'desc':forms.TextInput(attrs={'class': 'u-form'}) 
  } 
)  

模板

<div> 
   <form role="form" action="//" enctype='multipart/form-data' method="post" id="form_sample_2" class="form-horizontal" novalidate="">{% csrf_token %} 
     <div class="row"> 
          <div class="col-md-6" style="margin-bottom: 30px;"> 
                <label> name : </label> 
                  {{form.name}} 
          </div> 
           <div class="col-md-6" style="margin-bottom: 30px;"> 
                 {{ form1.management_form }} 
                 {% for f in form1 %} 
                <label> desc : </label> 
                  {{f.desc}} 
                 {% endfor %} 
          </div> 
     </div> 
     <input type="submit" value="Save" /> 
   </form> 
</div> 

View .py

form=fmodelForm(request.POST or None) 
formset = smodelFormset(request.POST or None) 
if form.is_valid(): 
   form.save() 
if formset.is_valid(): 
   forms=formset.save(commit=False) 
   for f in forms: 
    #here I want to add id of previously added form 
    f.save() 

请您参考如下方法:

form.save() 返回它保存的实例。然后我们可以遍历表单,对于每个表单,将 f.instance 的 .foreign_key 设置为该实例:

if form.is_valid() and formset.is_valid(): 
    <b>instance =</b> form.save() 
    instances = formset.save(commit=False) 
    for obj in instances: 
        <b>obj.foreign_key = instance</b> 
        obj.save()

您可能首先要验证 form 和 formset。因为如果两者之一无效。最好根本不保存任何数据。