【发布时间】:2020-01-17 11:45:24
【问题描述】:
大家好,我是 django 的初学者,正在使用 django3.0 构建一个旅馆预订系统,但我似乎无法让我的模型表单生成正确的查询集来获取我的 Reservations 模型中的数据,我不断收到 NameError 错误每次我尝试通过我的视图输入新日期时都会收到消息,现在我不太确定如何正确解决此错误
这是我的 models.py:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
now = timezone.now
end = timezone.now() + timezone.timedelta(days=2)
room_choices = [
('single_room', 'Single Room'),
('double_room', 'Double Room'),
('executive_room', 'Executive Room'),
]
class Reservation(models.Model):
room_type = models.CharField(max_length=30, choices=room_choices, default=room_choices[1])
check_in = models.DateField(default=timezone.now)
check_out = models.DateField(default=end)
class Meta:
verbose_name = 'Reservation'
verbose_name_plural = 'Reservations'
我想稍后在 views.py 中添加验证语句,以根据用户选择的 room_type 来确定房间的价格和数量,因此暂时忽略该字段
这是我的 forms.py:
from django import forms
from .models import Reservation
class AvailabilityForm(forms.ModelForm):
class Meta:
model = Reservation
fields = [
"room_type",
"check_in",
"check_out",
]
widgets = {
'check_in': forms.DateInput(format='%m/%d/%Y'),
'check_out': forms.DateInput(format='%m/%d/%Y'),
}
如果有人知道如何让小部件在管理员之外正常工作,显示日历 onclick 而不仅仅是内部带有日期字段的字符字段,也请帮我解决这个问题
这是我的 views.py:
from django.shortcuts import get_object_or_404, render
from datetime import timedelta, date
from django.contrib.auth.models import User
from django.contrib import messages
from . import forms
from .models import Reservation
def availability(request):
form = forms.AvailabilityForm()
reservation = Reservation
if request.method == 'POST':
form = forms.AvailabilityForm(request.POST or None)
if form.is_valid:
reserve = form.save(commit=False)
reserve.reservation = reservation
# check whether the dates are valid
# case 1: a room is booked before the check_in date, and checks out after the requested check_in date
case_1 = Reservation.objects.filter(check_in__lte=reserve.check_in).filter(check_out__gte=check_in)
# case 2: oom is booked before the requested check_out date and check_out date is after requested check_out date
case_2 = Reservation.objects.filter(check_in__lte=check_out, check_out__gte=check_out).exists()
#case3: room is booked in a date which lies between the two requested check-in/check-out dates
case_3 = Reservation.objects.filter(check_in__gte=check_in, check_out__lte=check_out).exists()
# if either of these is true, abort and render the error
if case_1 or case_2 or case_3:
return render(request, "availability.html", {"errors": "This room is not available on your selected dates", "form": form})
# else dates are valid
reserve.save()
messages.add_message(request, messages.SUCCESS, 'Room is available for your stay here')
return redirect("/complete_booking")
return render(request, "availability.html", {"form": form})
我尝试了不同的方法来尝试让我的视图验证 check_in 和 check_out 对象,因为您可以看到 case1 和 case2 使用不同的过滤技术,但似乎都不起作用,任何关于我哪里出错的帮助将不胜感激以及如何解决它
【问题讨论】:
-
在情况 1 中,您没有定义在
.filter(check_out__gte=check_in)中使用的check_in。 -
@NalinDobhal 你能否再澄清一点我不确定我是否理解我尝试将
.filter(check_out__gte=check_in)更改为.filter(check_out__gte=check_out),但它仍然给我相同的 NameError -
首先我希望您添加错误回溯。添加整个回溯。 (请不要图片)
-
@NalinDobhal 回溯太长,无法在此处粘贴它是否有您要查找的某个部分?
-
其实整个回溯都会有所帮助。它将显示具有正确行号的确切错误。
标签: django django-forms django-views