【问题标题】:Django generic view, check if request is in the same group as creatorDjango通用视图,检查请求是否与创建者在同一组中
【发布时间】:2020-06-13 07:08:28
【问题描述】:

我正在寻找一种方法来检查用户组,当请求用户与创建者在同一组中然后访问时,当不访问时,访问被拒绝。

这背后的原因是,并非每个工作人员都可以编辑所有贡献。只有当工作人员与作者在同一组时,工作人员才可以编辑文章。

我的观点:

class EditArticleView(LoginRequiredMixin, UpdateView):
    model = Article
    message = _("Your Article has been updated.")
    form_class = ArticleForm
    template_name = 'articles/article_update.html'


def form_valid(self, form):
    form.instance.user = self.request.user

    return super().form_valid(form)

def get_success_url(self):
    messages.success(self.request, self.message)
    return reverse('articles:list')

'''
def get_queryset(self):
    queryset = super(EditArticleView, self).get_queryset()
    queryset = queryset.filter(user=self.request.user)
    print(self.request.user)
    return queryset
'''

【问题讨论】:

    标签: django python-3.x python-3.7 django-generic-views django-2.2


    【解决方案1】:

    作为替代方案,您也可以考虑使用 docs 中所述的 UserPassesTest 混合:

    from django.contrib.auth.mixins import UserPassesTestMixin
    
    class EditArticleView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    
        def test_func(self):
            article = self.model.objects.get(pk=self.kwargs['pk'])
            return Group.objects.filter(user=self.request.user).filter(user=article.author).exists() # Or any other test you need
    
        # ... Your other view code
    

    【讨论】:

    • 感谢您的回复。我改为==。但它不起作用,Django 说Permission denied。当我打印elf.request.user.groupsarticle.author.groups 时,我都会得到none 作为结果。我仔细检查了 testuseres,两者都在同一个组中。一名成员,一名员工
    • 抱歉打错了。您没有说“组”是什么意思。你在使用组内构建吗?
    • 我的意思是我自己在后台管理后台创建的用户组
    • @Sama 更新了我的代码以满足我理解的环境
    • 同理,权限被拒绝。我交叉检查了print(Article.objects.get(pk=self.kwargs.get('pk')).user.groups)Noneprint(Group.objects.filter(user=self.request.user)) 显示登录用户的正确组
    猜你喜欢
    • 2016-08-24
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多