2016-08-03 25 views
1

Für meine "Tutorial-App" habe ich nach dem Erstellen eines Objekts einige spezifische Berechtigungen erstellt. Nur der Autor des Objekts muss in der Lage sein, es zu aktualisieren oder zu löschen.Django - Wie bestimmte benutzerdefinierte Berechtigungen in Ansichten und Vorlagen verwenden?

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

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

Also wollte ich diese Berechtigungen in meinem UpdateArticle und DeleteArticle allgemeine Ansichten verwenden. Das Problem ist, dass sie spezifisch sind und ich nicht weiß, wie man es benutzt.

Antwort

1

Sie können einen benutzerdefinierten 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) 

Mit diesem mixin, bleiben sie einfach vor allen allgemeinen Klassen in den Ansichten möchten Sie es verwenden in

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

Check out my other answer für weitere Informationen..

+0

Danke, aber in welcher Datei sollte ich die Erlaubnis Mixin schreiben? –

+1

@ LéoMouyna Sie können es an der Spitze Ihrer Sichten-Datei setzen, wenn Sie möchten, oder erstellen Sie eine neue Datei namens permissions.py und legen Sie sie dort. Es liegt an dir. – denvaar

+0

Vielen Dank für Ihre Hilfe! Im nächsten Schritt, wie kann ich wissen, ob diese Berechtigung in einer Vorlage wahr ist? Ist Dauerwelle es erhalten? –