Общий вид Django, проверьте, находится ли запрос в той же группе, что и создатель

Я ищу способ проверить группы пользователей, когда пользователь запроса находится в той же группе, что и Создатель, а затем доступ, а когда нет, доступ отклонен.

Причина этого в том, что не каждый сотрудник может редактировать все вклады. Только если сотрудник находится в той же группе, что и автор, сотрудник может редактировать статью.

Мой взгляд:

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
'''

person Sama    schedule 29.02.2020    source источник


Ответы (1)


В качестве альтернативы вы также можете рассмотреть возможность использования смешивания 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
person Chris    schedule 29.02.2020
comment
Спасибо за ваш ответ. Я изменил на ==. Но это не работает, Джанго говорит Permission denied. Когда я печатаю elf.request.user.groups и article.author.groups, в результате я получаю none. Я дважды проверяю testuseres, оба находятся в одной группе. Один как мембер и один как персонал - person Sama; 29.02.2020
comment
Извините за опечатку. Вы не сказали, что вы подразумеваете под «группами». Вы используете сборку в группах? - person Chris; 29.02.2020
comment
Я имею в виду, что с groubs мои собственные созданные группы пользователей в админке. - person Sama; 29.02.2020
comment
@Sama Обновил мой код, чтобы он соответствовал вашей среде, как я ее понял. - person Chris; 29.02.2020
comment
То же, в разрешении отказано. Я перепроверил, print(Article.objects.get(pk=self.kwargs.get('pk')).user.groups) говорит, что None и print(Group.objects.filter(user=self.request.user)) отображают правильную группу вошедшего в систему пользователя. - person Sama; 29.02.2020
comment
Что распечатывает print(Article.objects.get(pk=self.kwargs.get('pk')).user.groups.all())? - person Chris; 29.02.2020
comment
Затем оба показывают одно и то же имя группы, но разрешение отклонено - person Sama; 29.02.2020
comment
Если user — это поле в вашем Article, показывающее владельца: вы соответствующим образом адаптировали запрос в test_fucn, то есть вторым фильтром является .filter(user=article.user)? - person Chris; 29.02.2020
comment
Решено, спасибо. В некоторых сегодняшних тестах была ошибка. get_queryset больше не был комментарием. - person Sama; 29.02.2020