You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Django-permission的AuthorPermissionLogic在函数视图中失效

解决django-permission中文章作者无法编辑/删除自身文章的问题

嘿,我明白你现在的困扰——明明跟着官方示例搭了测试应用,还给用户在后台开了全权限,结果文章作者还是没法编辑或删除自己的文章。别着急,咱们从几个常见的排查点入手,应该能很快定位问题。

首先先补全你提到的模型代码(根据常规写法推测),方便后续分析:

# test_app/models.py
from django.db import models
from django.contrib.auth.models import User

class Article(models.Model):
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='articles')
    title = models.CharField(max_length=200)
    content = models.TextField()
    # 其他字段...

1. 核心问题:对象级权限逻辑没绑定到模型

django-permission的全局权限(后台给用户加的那些)是模型级的,但编辑/删除自己的文章属于对象级权限,需要专门给Article模型绑定作者权限逻辑。这是最容易漏掉的一步:

你需要在项目的某个初始化文件(比如test_app/apps.py或者settings.py)里添加这段代码,把AuthorPermissionLogic关联到Article模型:

from permission.utils.permissions import add_permission_logic
from permission.logics import AuthorPermissionLogic
from test_app.models import Article

# 给Article模型添加作者权限逻辑:允许作者编辑/删除自己创建的文章
add_permission_logic(Article, AuthorPermissionLogic())

AuthorPermissionLogic是django-permission内置的逻辑,默认就会让对象的created_by用户拥有该对象的change、delete权限,不用额外写规则。

2. 检查视图的权限验证是否正确

如果你用的是类视图,要确保用了django-permission提供的权限混入类,并且指定了正确的权限代码:

# test_app/views.py
from django.views.generic.edit import UpdateView, DeleteView
from permission.views import PermissionRequiredMixin
from .models import Article

class ArticleUpdateView(PermissionRequiredMixin, UpdateView):
    model = Article
    fields = ['title', 'content']
    # 指定需要的模型级权限,django-permission会自动处理对象级的校验
    permission_required = 'test_app.change_article'

class ArticleDeleteView(PermissionRequiredMixin, DeleteView):
    model = Article
    success_url = '/'
    permission_required = 'test_app.delete_article'

要是你用的是函数视图,记得用permission_required装饰器,并且加上raise_exception=True:

from django.shortcuts import get_object_or_404
from permission.decorators import permission_required
from .models import Article

@permission_required('test_app.change_article', raise_exception=True)
def article_edit(request, pk):
    article = get_object_or_404(Article, pk=pk)
    # 这里django-permission会自动校验当前用户是否有权限操作该article
    # 后续编辑逻辑...

3. 用shell验证权限是否生效

打开django shell,手动测试用户对自己文章的权限,能快速定位问题:

python manage.py shell

然后执行:

from django.contrib.auth.models import User
from test_app.models import Article

# 替换成你的测试用户和文章
user = User.objects.get(username='your_author_user')
article = Article.objects.filter(created_by=user).first()

# 检查对象级权限
print(user.has_perm('test_app.change_article', article))  # 正常应该返回True
print(user.has_perm('test_app.delete_article', article))  # 正常应该返回True

如果这里返回False,那肯定是权限逻辑没绑定好,回到第一步检查add_permission_logic的代码是否正确执行。

4. 确认django-permission的基础配置

最后再检查一下settings.py里的配置有没有遗漏:

  • INSTALLED_APPS里要加'permission'
  • MIDDLEWARE里要加'permission.middleware.PermissionMiddleware'

这些配置是django-permission生效的基础,要是漏了,权限逻辑根本跑不起来。

按照上面的步骤排查下来,大概率能解决作者无法操作自己文章的问题。如果还有疑问,可以把视图代码或者更多报错信息贴出来,咱们再细化分析。

内容的提问来源于stack exchange,提问作者dj.bettega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:00:59