Léo*_*yna 1 django django-views django-permissions
对于我的“教程应用程序”,我在创建对象后创建了一些特定权限。只有对象的作者才能更新或删除它。
\n\n我是初学者,我是来学习的,如果我的方法丑陋请宽容。
\n\n这是我的观点.py
\n\nclass 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())\nRun Code Online (Sandbox Code Playgroud)\n\n所以我想在我的 UpdateArticle 和 DeleteArticle 通用视图中使用这些权限。问题是它们是特定的,我不知道如何使用它。
\n您可以创建自定义权限混合,以确保只有作者才能对现有文章进行更改。这是一个简单的例子:
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)
查看我的其他答案以获取更多信息。