Как обновить несколько моделей, используя одну форму - PullRequest
0 голосов
/ 10 ноября 2019

Итак, я пытался обновить три модели:

models.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)

Итак, я пытаюсь создатьформа, в которой я могу принять от пользователя данные для pnr, name, dob, passport_no и обновить все три модели одновременно

я создал 3 формы моделей, которые выглядят так:

forms.py:

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

my views.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

страница выглядит так this

1 Ответ

0 голосов
/ 10 ноября 2019
It returns None because your forms seems like invalid and you have not returned anything when your forms are invalid, so, that's why it is returning None from the "passengerAdd" function

Note:- Python will return None when you don't return anything from the function


You can save multiple forms by passing an instances to your form's save method.

    Example:-

    views.py

    from django.shortcuts import render,redirect
    from .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():
                a = formA.save()
                b = formB.save(a)
                c = formC.save(a, b)
            return render(request, 'passenger/passenger_home.html')
        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)




        forms.py

        from django.forms import ModelForm
        from .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')
                }

            def save(self, b, commit=True):
                instance = super(nameForm, self).save(commit=False)

                if not self.instance.pk:
                    # create
                    if commit:
                        instance.pnr = b
                        instance.save()
                return instance


        class passenForm(ModelForm):
            class Meta:
                model = passenger
                fields = ('dob', 'passport_no')
                labels = {
                    'dob' : ('Date Of Birth'),
                    'passport_no' : ('Passport Number'),
                }

            def save(self, a, b, commit=True):
                instance = super(passenForm, self).save(commit=False)

                if not self.instance.pk:
                    # create
                    if commit:
                        instance.pnr = a
                        instance.name = b
                        instance.save()
                return instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...