【问题标题】:Filtering content based on users in django根据 django 中的用户过滤内容
【发布时间】:2015-11-27 12:04:06
【问题描述】:

当用户登录时,他/她应该只能看到相应用户创建的对象。

我如何在 django 中实现这一点?

当我从 db 访问对象时,我是否也应该根据用户请求对这些对象进行过滤,还是有 django 这样做的方式?

【问题讨论】:

  • 对应用户是什么意思?如果我理解您的问题,您可以使用群组。用户可以看到同一组中其他用户创建的对象。
  • 用户应该只能查看他创建的项目 --- 这就是我的意思

标签: django session authentication


【解决方案1】:

这是一个常见的要求 - 我写了一篇关于此的博客文章:http://spapas.github.io/2013/11/05/django-authoritiy-data/ 但用户不能访问他们的对象,而是可以访问他们“权限”的对象(即属于的用户组同一部门、公司等)。

在任何情况下,对于您需要仅由创建它们的用户可见/可编辑的所有模型,您需要为该模型创建对象的用户添加一个名为 created_by 的外键字段,就像是: created_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True)

之后,在创建对象时,您必须使用当前用户更新该字段。例如,如果您使用 CBV,则可以使用以下 mixin 来填充 created_by 字段(摘自我写的关于模型审计的另一篇博文 @http://spapas.github.io/2015/01/21/django-model-auditing/):

类 AuditableMixin(对象,): def form_valid(self, form, ): 如果不是 form.instance.created_by: form.instance.created_by = self.request.user return super(AuditableMixin, self).form_valid(form)

之后,当显示/更新其他对象的列表时(通过 ListView、UpdateView、DetailView),您可以覆盖 get_queryset 方法,以便它仅过滤具有与当前用户相似的创建者的结果。像这样的:

类 OnlyMineMixin(object, ): def get_queryset(self): qs = super(OnlyMineMixin, self).get_queryset() 返回 qs.filter(created_by=self.request.user)

现在所有使用此 mixin 的 CBV 将有权访问属于当前用户的对象。

【讨论】:

  • 正在寻找这样的东西。 . . .会试试这个并回复你。谢谢 。 . .
【解决方案2】:

如果您想让用户只看到他们创建的项目,这里有一个可以实现此行为的简单示例:

views.py

from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404, redirect, render

def show_items(request, username):
    user = get_object_or_404(User, username=username)
    if request.user == user:
        # get the items for the user, assuming there is a model item
        items = user.items.all()
    else:
        # redirect the user to the login page or whatever you want
        return redirect('login.html')
    return render(request, 'items.html', {items: items})

正如我所写,这只是一个非常简单的示例,可以让您了解如何开始。你必须适应并进一步扩展它。

【讨论】:

  • 好吧,正如你所猜测的那样,你用基本的 if 条件过滤............在想,是否有任何内置的 django 类或函数......无论如何,谢谢你的痛苦举个例子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2019-06-07
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
相关资源
最近更新 更多