Python 如何使用单个表单更新多个模型

Python 如何使用单个表单更新多个模型,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,所以我一直在尝试更新三个模型,即 型号。py: from django.db import models from postlog.models import FlightNum class pnr(models.Model): pnr=models.CharField(max_length=9,primary_key=True) def __str__(self): return self.pnr class name(models.Model):

所以我一直在尝试更新三个模型,即

型号。py:

from django.db import models
from postlog.models import FlightNum


class pnr(models.Model):
    pnr=models.CharField(max_length=9,primary_key=True)

    def __str__(self):
        return self.pnr

class name(models.Model):
    pnr=models.OneToOneField(pnr,on_delete=models.CASCADE,related_name='p1')
    name=models.CharField(max_length=10)

    def __str__(self):
        return self.name

class passenger(models.Model):
    pnr=models.OneToOneField(pnr,on_delete=models.CASCADE,primary_key=True,related_name='p2')
    name=models.ForeignKey(name,on_delete=models.CASCADE)
    dob=models.CharField(max_length=10)
    passport_no= models.CharField(max_length=10,blank=True)
    fl_no=models.ForeignKey (FlightNum,on_delete=models.SET_NULL,null=True,unique=False)
from Django.forms import ModelForm
from postlog.models import FlightNum
from passenger.models import pnr,name,passenger

class pnrForm(ModelForm):
    class Meta:
        model = pnr
        fields = '__all__'
        labels = {
            'pnr' : ('PNR')
        }

class nameForm(ModelForm):
    class Meta:
        model = name
        fields = ('name',)
        labels = {
            'name' : ('Name')
        }

class passenForm(ModelForm):
    class Meta:
        model = passenger
        fields = ('dob', 'passport_no', 'fl_no')
        labels = {
            'dob' : ('Date Of Birth'),
            'passport_no' : ('Passport Number'),
            'fl_no' : ('Flight Number'),
        }
所以我要做的是创建一个表单,在这个表单中我可以从用户那里获取pnr、name、dob、passport_no的输入,并同时更新所有三个模型

我创建了3个模型表单,如下所示:

forms.py:

from django.db import models
from postlog.models import FlightNum


class pnr(models.Model):
    pnr=models.CharField(max_length=9,primary_key=True)

    def __str__(self):
        return self.pnr

class name(models.Model):
    pnr=models.OneToOneField(pnr,on_delete=models.CASCADE,related_name='p1')
    name=models.CharField(max_length=10)

    def __str__(self):
        return self.name

class passenger(models.Model):
    pnr=models.OneToOneField(pnr,on_delete=models.CASCADE,primary_key=True,related_name='p2')
    name=models.ForeignKey(name,on_delete=models.CASCADE)
    dob=models.CharField(max_length=10)
    passport_no= models.CharField(max_length=10,blank=True)
    fl_no=models.ForeignKey (FlightNum,on_delete=models.SET_NULL,null=True,unique=False)
from Django.forms import ModelForm
from postlog.models import FlightNum
from passenger.models import pnr,name,passenger

class pnrForm(ModelForm):
    class Meta:
        model = pnr
        fields = '__all__'
        labels = {
            'pnr' : ('PNR')
        }

class nameForm(ModelForm):
    class Meta:
        model = name
        fields = ('name',)
        labels = {
            'name' : ('Name')
        }

class passenForm(ModelForm):
    class Meta:
        model = passenger
        fields = ('dob', 'passport_no', 'fl_no')
        labels = {
            'dob' : ('Date Of Birth'),
            'passport_no' : ('Passport Number'),
            'fl_no' : ('Flight Number'),
        }
我的视图.py

from django.shortcuts import render,redirect
from passenger.forms import passenForm, pnrForm, nameForm
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy

def passengerAdd(request):
    if request.method =="POST":
        formA = pnrForm(request.POST, prefix= 'pnr')
        formB = nameForm(request.POST, prefix= 'name')
        formC = passenForm(request.POST, prefix= 'pass')
        if formA.is_valid() and formB.is_valid() and formC.is_valid():
            fa = formA.save()
            fb = formB.save(commit=False)
            fb.pnr = fa
            fb.save()
            fc = formC.save(commit=False)
            fc.pnr = fa
            fc.name = fb
            fc.save()
        return redirect(reverse('passenger_list'))
    else:
        formA = pnrForm(prefix = 'pnr')
        formB = nameForm(prefix = 'name')
        formC = passenForm(prefix = 'pass')
        args = {'formA' : formA, 'formB' : formB, 'formC' : formC}
        return render(request, 'passenger_add.html', args)
我已经在html模板中包含了所有这三个表单


页面看起来像这样

它不返回任何内容,因为您的表单似乎无效,并且当表单无效时您没有返回任何内容,因此,这就是为什么它从“passengerAdd”函数不返回任何内容的原因

注意:-如果不从函数返回任何内容,Python将返回None 通过将实例传递到表单的save方法,可以保存多个表单。 例如:-

views.py

从django.shortcuts导入渲染,重定向
from.forms导入passenForm、pnrForm、nameForm
从django.views.generic导入ListView、CreateView、UpdateView、DeleteView
从django.url导入反向链接
def passengerAdd(请求):
如果request.method==“POST”:
formA=pnrForm(request.POST,前缀='pnr')
formB=nameForm(request.POST,前缀='name')
formC=passenForm(request.POST,前缀='pass')
如果formA.is\u valid()和formB.is\u valid()以及formC.is\u valid():
a=形式保存()
b=表格b.保存(a)
c=表格c.保存(a,b)
返回渲染(请求'passenger/passenger\u home.html')
其他:
formA=pnrForm(前缀='pnr')
formB=nameForm(prefix='name')
formC=passenForm(前缀='pass')
args={'formA':formA,'formB':formB,'formC':formC}
返回呈现(请求'passenger_add.html',args)
forms.py

从django.forms导入ModelForm
from.车型导入pnr、姓名、乘客
类pnrForm(模型形式):
类元:
型号=pnr
字段='\uuuu所有\uuuu'
标签={
‘pnr’:(‘pnr’)
}
类名称表单(模型表单):
类元:
型号=名称
字段=('name',)
标签={
'name':('name')
}
def保存(self、b、commit=True):
instance=super(nameForm,self).save(commit=False)
如果不是self.instance.pk:
#创造
如果提交:
instance.pnr=b
save()实例
返回实例
类passenForm(ModelForm):
类元:
型号=乘客
字段=('dob','passport\u no')
标签={
‘出生日期’:(‘出生日期’),
‘护照号码’:(‘护照号码’),
}
def保存(self、a、b、commit=True):
instance=super(passenForm,self).save(commit=False)
如果不是self.instance.pk:
#创造
如果提交:
instance.pnr=a
instance.name=b
save()实例
返回实例

使用。但我不能这样做吗?我正在尽可能地让它简单。我不知道如何使用表单谢谢。但我刚刚对视图文件进行了更改,如果您能查看,我将非常感激。使用我编辑过的视图会将记录添加到pnr模型和name模型中,但不会将记录添加到乘客模型中,因此如果您能建议对其进行更改,我将非常感激,但我肯定也会尝试您的方法