Skip to main content
 首页 » 编程设计

python之一个 html 表单,几个相互关联的 django 表单之如何保存

2024年10月25日38jpfss

有一个问题,我需要用一个 html 表单提交两个相互关联的模型表单。我知道如何提交两个单独的表格,但是在相关模型表格的情况下外键让我发疯。

问题是,第二个表单应该用外键填充字段到第一个表单的实例。

在这种特殊情况下,我决定合并两个模型,但我认为,在某些情况下,所描述问题的解决方法会很有用。

请考虑以下代码:

模型:

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) 

对应的django表单:

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

查看以处理表单:

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) 

我应该如何在 FacilityCreateView.post 中处理表单验证和保存?

请您参考如下方法:

解决此问题的一种方法是:

facility_detail_form.cleaned_data['facility'] = facility 

可以替换为:

facility_detail = facility_detail_form.save(commit=False) 
facility_detail.facility = facility 
facility_detail.save() 
 
#rest of the code.. . 

在这里commit=False creates对象,而不将其保存到数据库中,您可以在保存前分配外键对象。