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

Django - How to use specific custom permissions in views and templates?

对于我的 "tutorial app",我在创建对象后创建了一些特定权限。只有对象的作者才能更新或删除它。

我是初学者,学习而来,如有不妥之处请多多包涵

这是我的views.py

class CreateArticle(LoginRequiredMixin, generic.CreateView):

model = Article
context_object_name = 'article'
template_name = "blog/edit_article.html"
form_class = ArticleForm

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.slug = auto_slug(self.object.titre)
    user = User.objects.get(id=self.request.user.id)
    self.object.auteur = user

    self.object.save()

    """On génère les 2 permissions suivantes :
        Modifier l'article dont on est l'auteur
        Supprimer l'article dont on est l'auteur"""

    content_type = ContentType.objects.get(app_label='blog', model='article')
    permission = Permission.objects.create(
        codename='edit_article_{0}'.format(self.object.id),
        name='Modifier l\'article {0}'.format(self.object.titre),
        content_type=content_type
    )
    user.user_permissions.add(permission)
    permission = Permission.objects.create(
        codename='delete_article_{0}'.format(self.object.id),
        name='Supprimer l\'article {0}'.format(self.object.titre),
        content_type=content_type
    )
    user.user_permissions.add(permission)

    messages.success(self.request, "L'article a été crée")
    return HttpResponseRedirect(self.get_success_url())

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

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

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)

有了这个 mixin,只需将它放在任何通用 类 之前,就可以在您想要使用它的视图中使用它。

class CreateArticle(SameUserOnlyMixin, generic.CreateView):
    ...

查看 了解更多信息。