一个html表单,几个相互关联的django表单 - 如何保存? [英] One html form, several interrelated django forms - how to save?
本文介绍了一个html表单,几个相互关联的django表单 - 如何保存?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有一个问题,我需要用一个html表单提交两个相互关联的模型。我知道如何提交两个单独的表单,但是在相关模型的情况下,外键使我发疯。
问题是,第二个表单应该用外键填充字段,以便从第一个表单的实例。
在这种特殊情况下,我决定合并两个模型,但我认为应该有一些情况,以解决上述问题的解决方法。
请考虑以下代码:
模型:
from django.db导入模型
class Facility(models.Model):
name = models.CharField(max_length = 255)
$ b $ class FacilityDetail(models.Model):
some_details = models。 CharField(max_length = 255)
facility = models.ForeignKey(Facility)
对应的django表单:
from django import forms
$ b $ class FacilityForm(forms.ModelForm):
class Meta:
model = Facility
fields =('name')
$ b $ class FacilityDetailForm(forms.ModelForm):
class Meta :
model = FacilityDetail
fields =('some_details','facility')
View来处理表单:
from django.views.generic import View
FACILITY_PREFIX ='facility '
FACILITY_DETAIL_PREFIX ='facility_detail'
class FacilityCreateView(View):
def get(self,request,* args,** kwargs):
facility_form = FacilityForm(prefix = FACILITY_PREFIX)
facility_detail_form = FacilityDetailForm(prefix = FACILITY_DETAIL_PREFIX)
context = {$ b $'facility_form':facility_form,$ b $'facility_detail_form': facility_detail_form,
}
return render(request,'facility_create.html',context)
$ b $ def post(self,request,* args,** kwargs) :
facility_form = FacilityForm(request.POST,prefix = FACILITY_PREFIX)
facility_detail_form = FacilityDetailFo rm(request.POST,prefix = FACILITY_DETAIL_PREFIX)
如果facility_form.is_valid():
facility = facility_form.save()
#无效,因为如果facility_detail_form.is_valid():
facility_detail_form.cleaned_data ['facility'] = facility
$ b $ facility_detail_form.save()
$ b没有`facility`
$ b返回重定向(...)
上下文= {$ b $'facility_form':facility_form,
'facility_detail_form':facility_detail_form,
}
return render(response,'facility_list.html',context)
如何处理表单验证并保存在 FacilityCreateView.post
?
解决方案
解决这个问题是:
$ p $ lt; code> facility_detail_form.cleaned_data ['facility'] = facility
可以替换为:
facility_detail = facility_detail_form.save(commit = False)
facility_detail.facility = facility
facility_detail.save()
#rest代码..。
from django.db import models
class Facility(models.Model):
name = models.CharField(max_length=255)
class FacilityDetail(models.Model):
some_details = models.CharField(max_length=255)
facility = models.ForeignKey(Facility)
Corresponding django forms:
from django import forms
class FacilityForm(forms.ModelForm):
class Meta:
model = Facility
fields = ('name')
class FacilityDetailForm(forms.ModelForm):
class Meta:
model = FacilityDetail
fields = ('some_details', 'facility')
View to handle forms:
from django.views.generic import View
FACILITY_PREFIX = 'facility'
FACILITY_DETAIL_PREFIX = 'facility_detail'
class FacilityCreateView(View):
def get(self, request, *args, **kwargs):
facility_form = FacilityForm(prefix=FACILITY_PREFIX)
facility_detail_form = FacilityDetailForm(prefix=FACILITY_DETAIL_PREFIX)
context = {
'facility_form': facility_form,
'facility_detail_form': facility_detail_form,
}
return render(request, 'facility_create.html', context)
def post(self, request, *args, **kwargs):
facility_form = FacilityForm(request.POST, prefix=FACILITY_PREFIX)
facility_detail_form = FacilityDetailForm(request.POST, prefix=FACILITY_DETAIL_PREFIX)
if facility_form.is_valid():
facility = facility_form.save()
# is not valid, because there is no `facility`
if facility_detail_form.is_valid():
facility_detail_form.cleaned_data['facility'] = facility
facility_detail_form.save()
return redirect(...)
context = {
'facility_form': facility_form,
'facility_detail_form': facility_detail_form,
}
return render(response, 'facility_list.html', context)
How should I handle form validation and saving in FacilityCreateView.post
?
解决方案
One way you could fix this is:
facility_detail_form.cleaned_data['facility'] = facility
could be replaced with:
facility_detail = facility_detail_form.save(commit=False)
facility_detail.facility = facility
facility_detail.save()
#rest of the code.. .
Here commit=False
creates the object for you, without saving it to the database, where you can assign your foreign key object before saving.
这篇关于一个html表单,几个相互关联的django表单 - 如何保存?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文