求助:Django-permission的AuthorPermissionLogic在函数视图中失效
嘿,我明白你现在的困扰——明明跟着官方示例搭了测试应用,还给用户在后台开了全权限,结果文章作者还是没法编辑或删除自己的文章。别着急,咱们从几个常见的排查点入手,应该能很快定位问题。
首先先补全你提到的模型代码(根据常规写法推测),方便后续分析:
# 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

