django-permission AuthorPermissionLogic不在基于函数的视图中工作

时间:2018-04-05 10:51:19

标签: django django-permissions

在简单的测试应用程序上使用django-permission(几乎与文档中使用的示例相同),以试图弄清楚它是如何工作的。我已阅读文档并尝试使用此link上提供的示例应用。

问题在于文章的作者无法编辑/删除文章。

相关用户已获得管理部分中的所有权限。

下面列出的关键代码 - 任何非常感谢的帮助

test_app / models.py

class Article(models.Model):
    created_by = models.ForeignKey(User)
    created = models.DateField(auto_now_add=True)
    modified = models.DateField(auto_now=True)
    title = models.CharField(max_length=100)
    content = models.TextField()

    class Meta:
        app_label = 'test_app'

from permission import add_permission_logic
from permission.logics import AuthorPermissionLogic

add_permission_logic(Article, AuthorPermissionLogic(
    field_name='created_by',
    any_permission = False,
    change_permission = True,
    delete_permission = True,
))

test_app / views.py

@permission_required('change_article')
def change_article(request, *args, **kwargs):
    pk = kwargs.pop('pk')
    template = 'test_app/edit.html'
    article = models.Article.objects.get(id=pk)

    if request.method == 'POST':
        form = forms.Article_form(request.POST, instance=article)

        if form.is_valid():
            article = form.save(commit=False)

            article.created_by = request.user
            article.title = form.cleaned_data['title']
            article.content = form.cleaned_data['content']

            article.save()

            return HttpResponseRedirect('/test/')

        else:

            raise Http404

    else:
        form = forms.Article_form(instance=article)

        return render(request, template_name=template, context={'form':form})

test_app / perms.py

PERMISSION_LOGICS = (
    ('test_app.Article', AuthorPermissionLogic()),
)

修改

最后,对link上的项目Github页面进行了较长时间的讨论。

虽然问题的目标已经解决 - 但事实证明,函数本身是一个容易出现意外行为的遗留函数。项目所有者的建议是使用基于类的视图而不是基于函数的视图。

1 个答案:

答案 0 :(得分:1)

我真的没有得到什么

  

相关用户已获得管理部分中的所有权限。

表示(不确定"管理部分"是什么)但是

  1. perms.py添加权限逻辑时,您不需要models.py

  2. 您需要使用test_app.change_article代替(<app_label>.<perm>_<model_name>

  3. 顺便说一句,虽然您不需要perms.py,但这不是问题,但AuthorPermissionLogicperms.py的实例未正确配置尚未指定field_name那里(如果您未指定,则field_name的默认值为'author'。)https://github.com/lambdalisue/django-permission/blob/master/src/permission/conf.py#L24