Django - 如何在视图和模板中使用特定的自定义权限?

Léo*_*yna 1 django django-views django-permissions

对于我的“教程应用程序”,我在创建对象后创建了一些特定权限。只有对象的作者才能更新或删除它。

\n\n

我是初学者,我是来学习的,如果我的方法丑陋请宽容。

\n\n

这是我的观点.py

\n\n
class CreateArticle(LoginRequiredMixin, generic.CreateView):\n\nmodel = Article\ncontext_object_name = \'article\'\ntemplate_name = "blog/edit_article.html"\nform_class = ArticleForm\n\ndef form_valid(self, form):\n    self.object = form.save(commit=False)\n    self.object.slug = auto_slug(self.object.titre)\n    user = User.objects.get(id=self.request.user.id)\n    self.object.auteur = user\n\n    self.object.save()\n\n    """On g\xc3\xa9n\xc3\xa8re les 2 permissions suivantes :\n        Modifier l\'article dont on est l\'auteur\n        Supprimer l\'article dont on est l\'auteur"""\n\n    content_type = ContentType.objects.get(app_label=\'blog\', model=\'article\')\n    permission = Permission.objects.create(\n        codename=\'edit_article_{0}\'.format(self.object.id),\n        name=\'Modifier l\\\'article {0}\'.format(self.object.titre),\n        content_type=content_type\n    )\n    user.user_permissions.add(permission)\n    permission = Permission.objects.create(\n        codename=\'delete_article_{0}\'.format(self.object.id),\n        name=\'Supprimer l\\\'article {0}\'.format(self.object.titre),\n        content_type=content_type\n    )\n    user.user_permissions.add(permission)\n\n    messages.success(self.request, "L\'article a \xc3\xa9t\xc3\xa9 cr\xc3\xa9e")\n    return HttpResponseRedirect(self.get_success_url())\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我想在我的 UpdateArticle 和 DeleteArticle 通用视图中使用这些权限。问题是它们是特定的,我不知道如何使用它。

\n

den*_*aar 5

您可以创建自定义权限混合,以确保只有作者才能对现有文章进行更改。这是一个简单的例子:

class SameUserOnlyMixin(object):

    def has_permissions(self):
        # Assumes that your Article model has a foreign key called `auteur`.
        return self.get_object().auteur == self.request.user

    def dispatch(self, request, *args, **kwargs):
        if not self.has_permissions():
            raise Http404('You do not have permission.')
        return super(SameUserOnlyMixin, self).dispatch(
            request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

使用此 mixin,只需将其粘贴在您想要使用它的视图中的任何泛型类之前即可。

class CreateArticle(SameUserOnlyMixin, generic.CreateView):
    ...
Run Code Online (Sandbox Code Playgroud)

查看我的其他答案以获取更多信息。