我正在尝试创建一个系统,用户只能在他们预订的时间访问某个页面。未预订此次访问权限的用户将无法访问该页面。基本上,页面只有在用户预订后才可供用户使用!
我正在尽我所能去做下面的文件。
models.py
class Booking(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
daterequired = models.DateTimeField(default=datetime.now)
students = models.CharField(max_length=200)
length = models.IntegerField()
forms.py
class BookingForm(forms.ModelForm):
class Meta:
model = Booking
exclude = ['user', ]
widgets = {
'students': forms.TextInput(attrs={'placeholder': 'Number of Students'}),
'length': forms.TextInput(
attrs={'placeholder': 'Time needed in hours'}),
}
views.py
@login_required
def choose(request):
pod = Pod.objects.all()
FMT = "%Y-%m-%d %H:%M:%S"
booking = Booking.objects.get(user=request.user)
bookingtime = booking.daterequired
currenttime = datetime.now(timezone.utc)
tdelta = bookingtime - currenttime
if str(tdelta) <= str(booking.length):
print(tdelta)
return render(request, 'choose.html', {'pod': pod, 'booking': booking})
else:
return HttpResponse("<p>NO ACCESS</p>")
我不知道我现在有多远,但我会感谢任何正确方向的帮助。
谢谢你们!
答案 0 :(得分:2)
Booking.length是CharField。您正在尝试将int与字符串进行比较。 Booking.length应该是IntegerField。
如果您无法修改此项,则需要将booking.length转换为int,以将其与您的时差进行比较。
你的时差也是时间差。因此,您需要检索例如秒数(如果booking.length以秒计算)。而且你可能也不希望差异也是负面的(如果有可能在将来预订的话)。
if 0 <= timedifference.seconds <= int(booking.length):
请注意,您还可以决定将Booking.length存储为DurationField,以便将其作为timedelta而不是int进行检索。
答案 1 :(得分:0)
简化此操作的一种方法是在Booking方法中将当前时间与预订时间进行比较的逻辑。
然后,您可以在需要检查的任何视图中测试booking.time_booked()
。
这不是一个完整的答案,而是一个推荐,但我认为你在这里捆绑了几个问题。