Django身份验证 - 仅在View中过滤用户创建的(不是所有)记录

时间:2017-06-09 18:27:33

标签: django authentication django-models django-views django-queryset

我正在使用Python 3.6和Django 1.11

我有一个工作应用程序(用于学习目的)验证用户,然后允许用户创建"事物"以Django形式,基于模型。在这种情况下,用户可以退出"退出"吸烟或喝酒之类的东西,并指定他们的退出日期等。主页目前显示所有"事物的列表"由所有用户创建。世界上任何人都可以查看这些内容。

我想要做的是限制此视图,以便1)只有经过身份验证的用户才能查看“事物”。来自数据库,2)经过身份验证的用户只能查看他们的事情"。

我认为这将在app / views.py文件中启动。首先,主页视图(所有内容列表)如下所示:

def something_list(request):
    things = Thing.objects.filter(quit_date__lte=timezone.now()).order_by('quit_date')
    return render(request, 'quit/something_list.html', {'things': things})

这定义了一个按退出日期'排序的视图,并将其发送到我的“某个列表”列表中。模板。

通过在线搜索,似乎可以通过向 Thing.objects.filter()添加参数来指定仅查看用户的数据。到目前为止我尝试的所有内容都会导致错误,包括:

things = Thing.objects.filter(owner=request.user).filter(...)

和这个

things = Thing.objects.filter(owner=request.user, quit_date__lte=timezone.now()).order_by('quit_date')

这是我的模型,只是让你知道字段名称:

class Thing(models.Model):
    quitter = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    quit_date = models.DateTimeField(default=timezone.now)
    cost_per_day = models.DecimalField(max_digits=6, decimal_places=2)
    notes = models.TextField()

我再一次尝试弄清楚如何修改我的观点(上图),以便经过身份验证的用户只能看到“'事情”。他们创造了。此外,我希望未经授权的用户看到“事情”中的任何内容。希望两者都能用相同的代码完成。

提前致谢。我是初学者。如果答案需要更多信息,请告诉我。

更新:(解决方案) 以下其他人提供的解决方案是正确的。以下是适用于我的代码行:

things = Thing.objects.filter(quitter=request.user).filter(quit_date__lte=timezone.now()).order_by('quit_date')

当我做出这个改变时,我得到了一个匿名用户'对象错误。我需要为未经身份验证的用户整理我的默认视图。如果用户已登录,则他们现在只能看到他们的数据,但如果匿名用户查看此页面,则会出现错误。我添加了一个" if,else"以我的观点来处理这个问题。它现在似乎正在起作用,我想我会分享我的整个观点,以防它可能对某人有所帮助。

def something_list(request):    
if request.user.is_authenticated:
    things = Thing.objects.filter(quitter=request.user).filter(quit_date__lte=timezone.now()).order_by('quit_date')
    return render(request, 'quit/something_list.html', {'things': things})
else: 
    return render(request, 'quit/base.html')

1 个答案:

答案 0 :(得分:1)

您的字段名为quitter,而不是owner

Thing.objects.filter(quitter=request.user, ....)

为了将来参考,当您收到错误时,您应该将它们发布在问题中。