根据时间过滤对某些视图的访问?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据时间过滤对某些视图的访问?相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个系统,用户只能在他们预订的时间访问某个页面。未预订此次访问权限的用户将无法访问该页面。基本上该页面只有在用户预订后才可供用户使用!
我正在尽我所能去做,看看下面的文件。
models.朋友
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.朋友
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.朋友
@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>")
我不知道我现在有多远,但是会欣赏正确方向的任何帮助。
多谢你们!
答案
Booking.length是CharField。您正在尝试将int与字符串进行比较。 Booking.length应该是IntegerField。
如果你不能修改它,那么你需要将booking.length转换为int来将它与你的时差进行比较。
你的时差也是时间差。因此,您需要检索例如秒数(如果booking.length以秒计算)。而你可能也不希望差异也是负面的(如果有可能在将来预订)。
if 0 <= timedifference.seconds <= int(booking.length):
请注意,您还可以决定将Booking.length存储为DurationField,以便将其作为timedelta而不是int进行检索。
另一答案
简化此操作的一种方法是在Booking方法中将当前时间与预订时间进行比较的逻辑。
然后你可以在任何需要检查的视图中测试booking.time_booked()
。
这不是一个完整的答案,而是一个推荐,但我认为你在这里捆绑了几个问题。
以上是关于根据时间过滤对某些视图的访问?的主要内容,如果未能解决你的问题,请参考以下文章