根据时间过滤对某些视图的访问?

时间:2018-03-12 21:13:38

标签: django django-models django-forms django-views

我正在尝试创建一个系统,用户只能在他们预订的时间访问某个页面。未预订此次访问权限的用户将无法访问该页面。基本上,页面只有在用户预订后才可供用户使用!

我正在尽我所能去做下面的文件。

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>")

我不知道我现在有多远,但我会感谢任何正确方向的帮助。

谢谢你们!

2 个答案:

答案 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()

这不是一个完整的答案,而是一个推荐,但我认为你在这里捆绑了几个问题。