2016-08-03 113 views
1

對於我的「教程應用程序」,我在創建對象後創建了一些特定的權限。只有對象的作者必須能夠更新或刪除它。Django - 如何在視圖和模板中使用特定的自定義權限?

我是一名初學者,我在這裏學習,如果我的方法很難容忍。

這裏我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()) 

,所以我想在我的UpdateArticle和DeleteArticle通用視圖使用這些權限。問題是它們是特定的,我不知道如何使用它。

回答

1

您可以創建自定義權限混合以確保只有作者被允許對現有文章進行更改。這裏有一個簡單的例子:

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) 

有了這個混入,只需在視圖中的任何泛型類之前堅持它,你想在使用它

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

退房my other answer更多信息。

+0

謝謝,但我應該在哪個文件中寫入權限mixin? –

+1

@LéoMouyna如果你願意,你可以把它放在你的視圖文件的頂部,或者創建一個名爲permissions.py的新文件並放在那裏。隨你便。 – denvaar

+0

非常感謝您的幫助! 下一步,我怎麼知道這個權限在模板中是否爲真?燙髮是收到的嗎? –