如何将多个表单放在同一个 views.py 函数中 - Django

how to put multiple Forms in the same views.py function - Django

我需要将四个Form放在一个views.py函数中,但我不知道该怎么做。

我需要所有表格同时显示在网站上。

我会听取有关如何解决此问题的任何建议。

models.py

# Hotel
class Hotel(models.Model):
    customer = models.ForeignKey(Account, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    short_description = models.TextField(max_length=250)
    long_description = models.TextField(max_length=2000, null=True)
    HOTEL_STAR = (
        ('1', '1'),
        ('2', '2'),
        ('3', '3'),
        ('4', '4'),
        ('5', '5')
    )
    star = models.TextField(max_length=1, default=5, choices=HOTEL_STAR, null=True)
    picture = models.ImageField(upload_to='images/%Y/%m/%d/',default="images/default.jpg" , blank=True)
    created = models.DateTimeField(auto_now_add=True, null=True)


    def __str__(self):
        return str(self.name)

# Room
class Room(models.Model):
    hotel = models.ForeignKey(Hotel, null=True, on_delete=models.CASCADE)
    def __str__(self):
        return f'Room of {self.hotel}'

# Single type for Room
class Single(models.Model):
    room = models.ForeignKey(Room, null=True, on_delete=models.CASCADE)

    ROOM_NAME = (
        ('Budget_single_room', 'Budget Single Room'),
        ('Standard_single_room', 'Standard Single Room'),
        ('Superior_single_room', 'Superior Single Room'),
        ('Deluxe_single_room', 'Deluxe Single Room'),
    )
    name = models.TextField(max_length=30, choices=ROOM_NAME, null=True)

    ROOM_SMOKE = (
        ('Smoking', 'Smoking'),
        ('Non-Smoking', 'Non-Smoking'),
    )
    smoke = models.TextField(max_length=15, choices=ROOM_SMOKE, null=True)

    bed = models.IntegerField()
    capacity = models.IntegerField()
    room_size = models.IntegerField()

    def __str__(self):
        return f'{self.name}'

# Double type for Room
class Double(models.Model):
    room = models.ForeignKey(Room, null=True, on_delete=models.CASCADE)

    ROOM_NAME = (
        ('Budget_Double_room', 'Budget Double Room'),
        ('Standard_Double_room', 'Standard Double Room'),
        ('Superior_Double_room', 'Superior Double Room'),
        ('Deluxe_Double_room', 'Deluxe Double Room'),
    )
    name = models.TextField(max_length=30, choices=ROOM_NAME, null=True)

    ROOM_SMOKE = (
        ('Smoking', 'Smoking'),
        ('Non-Smoking', 'Non-Smoking'),
    )
    smoke = models.TextField(max_length=15, choices=ROOM_SMOKE, null=True)

    bed = models.IntegerField()
    capacity = models.IntegerField()

    BED_SIZE = (
        ('Single_bed_90_130', 'Single Bed / 90-130 cm wide'),
        ('Double_bed_131_150', 'Double Bed / 131-150 cm wide'),
        ('Large_bed_king_size_151_180', 'Large Bed (King Size) / 151-180 cm wide'),        
        )

    room_size = models.IntegerField()


    def __str__(self):
        return f'{self.name}'

# Bed Quantity for Single and Double types
class BedQuantity(models.Model):
    type = models.ForeignKey(Double, null=True, on_delete=models.CASCADE)

    number_of_bed = models.IntegerField(null=True)
    def __str__(self):
        return f'{self.type} with {self.number_of_bed} beds'

forms.py

from django.forms import ModelForm
from .models import Hotel, Apartment, Single, Double, BedQuantity

class HotelForm(ModelForm):
    class Meta:
        model = Hotel
        exclude = ('customer',)

class SingleForm(ModelForm):
    class Meta:
        model = Single
        exclude = ('room',)


class DoubleForm(ModelForm):
    class Meta:
        model = Double
        exclude = ('room',)


class BedQuantityForm(ModelForm):
    class Meta:
        model = BedQuantity
        exclude = ('type',)


class ApartmentForm(ModelForm):
    class Meta:
        model = Apartment
        exclude = ('customer',)

views.py

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import Hotel, Room, Single, Double, BedQuantity
from .forms import HotelForm, ApartmentForm, SingleForm, DoubleForm, BedQuantityForm

@login_required
def add_hotel(request):
    form = HotelForm()
    if request.method == "POST":
        form = HotelForm(request.POST, request.FILES)
        if form.is_valid():
            data = form.save(commit=False)
            data.customer = request.user
            data.save()
            return redirect('/')

    context = {'form':form,}
    return render(request, 'add_hotel.html', context)

如果您想从 view 呈现多个表单,您必须先在视图中实例化所有表单,然后将它们传递给模板。

按照这些思路应该可行。

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import Hotel, Room, Single, Double, BedQuantity
from .forms import HotelForm, ApartmentForm, SingleForm, DoubleForm, BedQuantityForm

@login_required
def add_hotel(request):
    # instantiate the forms
    hotel_form = HotelForm()
    apartment_form = ApartMentForm()
    single_form = SingleForm()
    double_form = DoubleForm()

    if request.method == "POST":
        hotel_form = HotelForm(request.POST, request.FILES)
        apartment_form = ApartMentForm(request.POST)
        single_form = SingleForm(request.POST)
        double_form = DoubleForm(request.POST)
        if form.is_valid():
            data = hotel_form.save(commit=False)
            data.customer = request.user
            data.save()
            # do your thing with other forms and save them as well
            return redirect('/')

    context = {
        'hotel_form': hotel_form,
        'apartment_form': apartment_form,
        ...
     }
    return render(request, 'add_hotel.html', context)

另请注意,请尽量避免使用 python keywords 这样的 type 作为变量名。