Переопределить get_queryset, основываясь на разрешениях django-guardian

Я пытаюсь переопределить get_queryset основанный на разрешениях объекта, которые пользователи имеют от django guardian, так что видны только объекты, для которых у пользователей есть разрешения.

def get_queryset(self, request):
    if request.user.is_superuser:
        qs = super(MyAdminInline, self).get_queryset(request)
        return qs  

    for item in MyModel.objects.all():
        for perm in get_perms(request.user, item):
            things_user_can_see = get_objects_for_user(request.user, perm)
            return things_user_can_see

К сожалению, это буквально ничего не делает, и все элементы, независимо от разрешений, которые есть у пользователей, видны.

1 ответ

Во-первых, вам нужно понять, какие разрешения требуются для вашего просмотра. Затем, в соответствии с этими разрешениями, извлекайте объекты.

Если вы не знаете разрешений для объекта, то вы можете фильтровать ваши объекты по всем разрешениям, связанным с моделью.

Документы для получения:

from guardian.shortcuts import get_objects_for_user, get_perms_for_model

class MyAdminInline():
    def get_queryset(self, request):
        if request.user.is_superuser:
            qs = super(MyAdminInline, self).get_queryset(request)
            return qs  

        all_model_perms = get_perms_for_model(MyModel)
        return get_objects_for_user(request.user, all_model_perms)

И это все! Не зацикливаясь на каждом объекте, проверяя разрешения и возвращая неправильный путь.

Другие вопросы по тегам