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

Django 将访问模型限制为所有者或超级用户的最佳方法,django,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}) 是否有更好的实践\捷径 谢谢是的,有一些捷径。如果使用基于类的视图,则可以使用。

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

例如:

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})
是否有更好的实践\捷径


谢谢

是的,有一些捷径。如果使用基于类的视图,则可以使用。
您还可以在
url.py
文件中使用装饰器

创建装饰器总是比较干净的

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