Django 身份验证 - 在视图中仅过滤用户创建的(不是全部)记录



我正在使用Python 3.6和Django 1.11

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

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

我想象这将如何完成是在应用程序/视图.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')

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

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

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

最新更新