/ / Django - Comment utiliser des autorisations personnalisées spécifiques dans les vues et les modèles? - django, django-views, django-permissions

Django - Comment utiliser des autorisations personnalisées spécifiques dans les vues et les modèles? - django, django-views, django-permissions

Pour mon "application tutoriel", j'ai créé des autorisations spécifiques après avoir créé un objet. Seul l'auteur de l'objet doit pouvoir le mettre à jour ou le supprimer.

Je suis un débutant et je suis ici pour apprendre, si mes méthodes sont moches et tolérantes.

Voici mon 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())

J'ai donc voulu utiliser ces autorisations dans mes vues génériques UpdateArticle et DeleteArticle. Le problème est qu'ils sont spécifiques et je ne sais pas comment les utiliser.

Réponses:

2 pour la réponse № 1

Vous pouvez créer un mixage d'autorisations personnalisé pour vous assurer que seul l'auteur est autorisé à apporter des modifications à un article existant. Voici un petit exemple:

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)

Avec ce mixin, collez-le simplement avant toutes les classes génériques dans les vues dans lesquelles vous souhaitez l'utiliser.

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

Check-out mon autre réponse pour plus d'informations.