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

非常感谢您的帮助! 下一步,我怎么知道这个权限在模板中是否为真?烫发是收到的吗? –