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

问题描述 投票:0回答:2

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

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

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

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

多谢你们!

django django-models django-forms django-views
2个回答
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进行检索。


0
投票

简化此操作的一种方法是在Booking方法中将当前时间与预订时间进行比较的逻辑。

然后你可以在任何需要检查的视图中测试booking.time_booked()

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

© www.soinside.com 2019 - 2024. All rights reserved.