将访问模型限制为所有者或超级用户的最佳方式

时间:2018-04-11 08:30:59

标签: django

我只需要将模型对象的访问权限限制为用户创建它或超级用户。

例如:

post = get_object_or_404(Post, slug=kwargs['slug'])
if post.created_by == request.user or request.user.is_superuser:
    return render(request, "post.html", {"post": post})

这有更好的练习\快捷方式吗?

谢谢

2 个答案:

答案 0 :(得分:0)

是的,有一些快捷方式。如果您使用基于类的视图,则可以使用class decorator。 您也可以在urls.py文件中使用装饰器。 Here's how

答案 1 :(得分:0)

创建装饰器总是更干净

from functools import wraps

from django.shortcuts import get_object_or_404, redirect
from django.utils.decorators import available_attrs


def user_can_view():
    def decorator(view_func):
        @wraps(view_func, assigned=available_attrs(view_func))
        def _wrapped_view(request, *args, **kwargs):

            post = get_object_or_404(Post, slug=kwargs['slug'])
            if post.created_by == request.user or request.user.is_superuser:
                return view_func(request, *args, **kwargs)

            # Redirct to another view or raise 404 instead
            return redirect('posts')
        return _wrapped_view
    return decorator


@user_can_view()
def my_view(request):
    return render(request, "post.html", {"post": post})