/ / Django - Wie verwendet man bestimmte benutzerdefinierte Berechtigungen in Ansichten und Vorlagen? - Django, Django-Ansichten, Django-Berechtigungen

Django - Wie verwendet man bestimmte benutzerdefinierte Berechtigungen in Ansichten und Vorlagen? - Django, Django-Ansichten, Django-Berechtigungen

Für meine "Tutorial-App" habe ich nach dem Erstellen eines Objekts bestimmte Berechtigungen erstellt. Nur der Autor des Objekts muss das Objekt aktualisieren oder löschen können.

Ich bin Anfänger und ich bin hier, um zu lernen, ob meine Methoden hässlich sind, tolerant zu sein.

Hier meine Ansichten

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

Daher wollte ich diese Berechtigungen in meinen generischen Ansichten UpdateArticle und DeleteArticle verwenden. Das Problem ist, dass sie spezifisch sind und ich weiß nicht, wie ich damit umgehen soll.

Antworten:

2 für die Antwort № 1

Sie können ein benutzerdefiniertes Berechtigungsmix erstellen, um sicherzustellen, dass nur der Autor Änderungen an einem vorhandenen Artikel vornehmen darf. Hier ist ein kurzes Beispiel:

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)

Bei diesem Mixin kleben Sie es einfach vor den generischen Klassen in den Ansichten, in denen Sie es gerne verwenden möchten.

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

Auschecken meine andere Antwort Für mehr Information.