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

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

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

以上是关于根据时间过滤对某些视图的访问?的主要内容,如果未能解决你的问题,请参考以下文章

片段中的某些视图未使用过渡动画

如何在销毁活动之前在视图寻呼机内的片段中执行某些操作

LINQ:根据某些条件过滤项目列表,并按条件执行某些操作

Flutter:根据某些条件过滤列表

按角色限制对烧瓶视图功能的某些区域的访问?

如果使用导航控制器,如何删除某些片段中的底部导航视图和工具栏?