【问题标题】:how to put multiple Forms in the same views.py function - Django如何将多个表单放在同一个views.py函数中 - Django
【发布时间】:2021-09-26 13:51:58
【问题描述】:

我需要将四个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)

【问题讨论】:

    标签: python-3.x django django-models django-views django-forms


    【解决方案1】:

    如果您想从 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 作为变量名。

    【讨论】:

    • 你能在上面看到我的评论吗?谢谢。
    • 能否请您发布您的traceback 。另外,我不懂你们的 cmets 中使用的语言。
    • 没有回溯,只是不保存。它无效,因为如果表单有效,我试图打印一些东西,所以它没有打印。
    • 这可能是您的一个或多个表单可能无效的问题。请使用breakpointprint等,进一步调试问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2020-06-30
    • 2020-02-22
    • 2016-01-06
    相关资源
    最近更新 更多