Python 如何在django模型表单中保存外键
我有两个模型,一个表单和一个表单集,所以表单集包含表单的外来项,我想在保存表单和表单集时将addid保存到表单集 model.pyPython 如何在django模型表单中保存外键,python,django,Python,Django,我有两个模型,一个表单和一个表单集,所以表单集包含表单的外来项,我想在保存表单和表单集时将addid保存到表单集 model.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,nul
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')
forms.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>
form.save()
返回它保存的实例。然后,我们可以对表单进行迭代,并为每个表单设置f.instance
的.foreign\u键
:
if form.is_valid() and formset.is_valid():
instance = form.save()
instances = formset.save(commit=False)
for obj in instances:
obj.foreign_key = instance
obj.save()
如果form.is\u valid()和formset.is\u valid():
instance=form.save()
实例=formset.save(提交=False)
在下列情况下,对于obj:
obj.foreign_key=实例
对象保存()
您可能首先要验证
表单
和表单集
。因为如果其中一个无效。最好不要保存任何数据。在解决了我自己的问题后,现在觉得自己很笨
因此,答案如下:
views.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=fmodelForm(request.POST or None)
formset = smodelFormset(request.POST or None)
#Just add
if request.method == 'POST':
if form.is_valid() and if formset.is_valid():
instance=form.save()
forms=formset.save(commit=False)
for f in forms:
f.foreignkey=instance.id
f.save()
由于某种原因,当我编写条件“if form.is\u valid()和formset.is\u valid():”时,表单集没有保存。@SharathNayak:等等,
formset.save()
将为您提供对象实例,而不是表单。因此,您迭代了obj
s,请参见编辑。@SharathNayak:您是否将外键
排除在表单集
表单中包装的表单之外?当然,您不应该验证该字段,因为当时它还没有设置。我将“外键”排除在表单之外,我理解您的答案,但出于某种原因,如果我添加“如果条件”表单集没有保存值。@SharathNayak:那么表单集.是否有效()
是否为False
?您能否呈现/打印此表单集生成的错误?