gpt4 book ai didi

python - 使用 ModelMultipleChoiceField 保存时出现 ValueError

转载 作者:太空宇宙 更新时间:2023-11-03 21:20:54 24 4
gpt4 key购买 nike

我正在编写一个酒店预订系统。我有一个名为“预订”的模型。我可以创建包含开始日期、结束日期的预订、预订一间房间并分配 1 位客人。然而,当我去修改模型、表单和 View 以保存超过 1 个房间和客人时,我开始收到 ValueError。

我收到的错误是:

ValueError at /reservation/new
Cannot assign "<QuerySet [<Guest: Ringo Star>]>": "Reservation.fk_guest" must be a "Guest" instance.

我知道我需要分配一个 Guest 实例,但我不明白如何分配。

models.py

class Property(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50, blank=True)
city = models.CharField(max_length=50, blank=True)
state = models.CharField(max_length=2, choices=STATE_CHOICES, default='NY', blank=True)
zip = models.CharField(max_length=5, blank=True)
description = models.CharField(max_length=255, blank=True)

class Meta:
verbose_name = "Property"
verbose_name_plural = "Properties"

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


class Room(models.Model):
name = models.CharField(max_length=25)
number = models.IntegerField(blank=True)
fk_Property = models.ForeignKey(Property, on_delete=models.CASCADE)

class Meta:
verbose_name = "Room"
verbose_name_plural = "Rooms"

def __str__(self):
return f"{self.name} in {self.fk_Property}"


class Guest(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
address = models.CharField(max_length=50, blank=True)
city = models.CharField(max_length=50, blank=True)
state = models.CharField(max_length=2, choices=STATE_CHOICES, default='NY', blank=True)
zip = models.CharField(max_length=5, blank=True)
phone = models.CharField(max_length=10, blank=True)
email = models.CharField(max_length=50, blank=True)
dob = models.DateField(null=True)

class Meta:
verbose_name = "Guest"
verbose_name_plural = "Guests"

def __str__(self):
return f"{self.first_name} {self.last_name}"


class Reservation(models.Model):
date_start = models.DateField()
date_end = models.DateField()
fk_guest = models.ForeignKey(Guest, on_delete=models.CASCADE)
fk_room = models.ForeignKey(Room, on_delete=models.CASCADE)
created_date = models.DateField(auto_now_add=True)
modified_date = models.DateField(auto_now=True)
# created_by = models.ForeignKey(Guest, on_delete=models.CASCADE)
# modified_by = models.ForeignKey(Guest, on_delete=models.CASCADE)

class Meta:
verbose_name = "Reservation"
verbose_name_plural = "Reservations"

def __str__(self):
return f"{self.date_start} to {self.date_end} reserved by {self.fk_guest} in {self.fk_room}"

forms.py

import datetime

from django import forms
from django.forms import ModelForm
# from django.forms.extras.widgets import SelectDateWidget

from .models import Guest, Reservation, Room


class GuestForm(forms.ModelForm):
class Meta:
model = Guest
fields = {'first_name', 'last_name', 'address',
'city', 'state', 'zip', 'phone', 'email', 'dob'}


class NewReservationsForm(forms.ModelForm):
# date_start = forms.DateField(label='Start Date', widget=SelectDateWidget)
# date_end = forms.DateField(label='End Date', widget=SelectDateWidget)
date_start = forms.DateField(label='Start Date')
date_end = forms.DateField(label='End Date')
fk_guest = forms.ModelMultipleChoiceField(label="Guest(s)", queryset=Guest.objects.all())
fk_room = forms.ModelMultipleChoiceField(label="Room(s)", queryset=Room.objects.all())

class Meta:
model = Reservation
fields = ['date_start', 'date_end', 'fk_guest', 'fk_room']

views.py

@login_required
def reservation_new(request):
if request.method == 'POST':
# TODO Create ability to select multiple rooms and multiple guests.
form = NewReservationsForm(request.POST)
if form.is_valid():
form.save()
return redirect('reserve:reservation_list')
else:
return HttpResponse("New Registration form failed validation!", form)
else:
form = NewReservationsForm()
context = {
"form": form,
}
return render(request, 'reserve/reservation_new.html', context)

最佳答案

问题在于,Reservation.fk_guestRervation.fk_room 在需要是 ManyToManyField 时却是外键。这应该会让你在开发中摆脱困境。

class Reservation(models.Model):
guests = models.ManyToManyField(Guest, on_delete=models.CASCADE)
rooms = models.ManyToManyField(Room, on_delete=models.CASCADE)

关于python - 使用 ModelMultipleChoiceField 保存时出现 ValueError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54261911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com