当用户登录时,他/她应该只能看到相应用户创建的对象。
我如何在django中实现这一目标?
当我从数据库访问对象时,我是否应该根据用户请求对这些对象进行过滤,或者是否有 django 这样做?
答案 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})
正如我所写的,这只是一个非常简单的例子,让您了解如何开始。你必须适应并进一步扩展它。