一个html表单,几个相互关联的django表单 - 如何保存? [英] One html form, several interrelated django forms - how to save?

查看:126
本文介绍了一个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代码..。

这里 commit = False 为您创建对象,而不保存到数据库,您可以在保存前分配外键对象。

There is a problem, I need to submit two interrelated modelforms with one html form. I know how to submit two separate forms, but foreign key makes me crazy in case of related modelforms.

The problem is, that second form should have filled field with foreign key to instance from first form.

In this particular case I decided to merge two models, but I think, there should be cases, where workaround for described problem would be useful.

Please consider following code:

Models:

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屋!

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