2016-08-03 8 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

作成者のみが既存のアーティクルに変更を加えることができるように、カスタムアクセス許可mixinを作成できます。ここでは簡単な例です:。

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

ありがとうございますが、どのファイルにミックスイン許可書を書く必要がありますか? –

+1

@LéoMouynaあなたが望むなら、あなたのビューファイルの一番上に置くか、permissions.pyという新しいファイルを作成してそこに置くことができます。それはあなた次第です。 – denvaar

+0

ありがとうございました! 次の手順では、このアクセス許可がテンプレートに該当するかどうかをどのように知ることができますか?パーマはそれを受け取ったのですか? –

関連する問題