Para o meu "aplicativo tutorial", criei algumas permissões específicas depois de criar um objeto. Somente o autor do objeto precisa ser capaz de atualizá-lo ou excluí-lo.
Sou iniciante e estou aqui para aprender, se meus métodos são feios, sejam tolerantes.
Aqui minhas 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())
Então, eu queria usar essas permissões nos meus modos de exibição genéricos UpdateArticle e DeleteArticle. O problema é que eles são específicos e eu não sei como usá-lo.
Respostas:
2 para resposta № 1Você pode criar um mix de permissões personalizadas para garantir que apenas o autor tenha permissão para fazer alterações em um artigo existente. Aqui está um exemplo rápido:
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)
Com este mixin, basta colocá-lo antes de qualquer classe genérica nas visualizações em que você deseja usá-lo.
class CreateArticle(SameUserOnlyMixin, generic.CreateView):
...
Confira minha outra resposta para mais informações.