【发布时间】:2017-11-11 20:53:02
【问题描述】:
我正在使用 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')
进行此更改时,出现“AnonymousUser”对象错误。我需要为未经身份验证的用户整理我的默认视图。如果用户登录,他们现在只能看到他们的数据,但如果匿名用户查看此页面,他们会收到错误消息。我在我的视图中添加了一个“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')
【问题讨论】:
-
您列出的
filter尝试中的任何一个都应该这样做,并可能更正您的型号代码引用quitter而您的示例过滤器引用owner。如果这不仅仅是转录代码时引入的错误,那就是问题所在。 -
至于限制未经授权的用户的访问,如果未经授权,我通常会将我的应用程序设置为重定向到登录页面,如文档中所述:docs.djangoproject.com/en/1.11/topics/auth/default/… 但如果不是,
if request.user.is_authenticated: -
感谢您的帮助。这就是问题所在。我上面有详细的更新。
标签: django authentication django-models django-views django-queryset