根据django中的用户过滤内容

时间:2015-09-02 05:41:21

标签: django session authentication

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

我如何在django中实现这一目标?

当我从数据库访问对象时,我是否应该根据用户请求对这些对象进行过滤,或者是否有 django 这样做?

2 个答案:

答案 0 :(得分: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/的另一篇博客文章):

  class AuditableMixin(object,):
    def form_valid(self, form, ):
        if not form.instance.created_by:
            form.instance.created_by = self.request.user

        return super(AuditableMixin, self).form_valid(form)

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

  class OnlyMineMixin(object, ):
    def get_queryset(self):
        qs = super(OnlyMineMixin, self).get_queryset()
        return qs.filter(created_by=self.request.user)

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

答案 1 :(得分:0)

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

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

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