Создание штатного пользователя и предоставление прав в Django

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

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

Простите, прочитав ваш вопрос еще раз, я думаю, что совершенно неправильно вас понял. Я оставлю свой ответ ниже, если это поможет кому-то еще. Когда вы назначаете пользователя как Staff User в интерфейсе администратора, ваш пользователь не должен иметь никаких прав по умолчанию. Вот что я вижу в своем интерфейсе администратора при назначении штатного пользователя:

enter image description here

Есть ли у вас группы, которые уже отображаются в интерфейсе администратора?

Мой первоначальный не относящийся к делу ответ:

Вам необходимо ограничить ваши представления вручную. Если вы используете представления на основе классов (CBVs), вы можете сделать это с помощью миксина (UserPassesTestMixin, например, или LoginRequiredMixin), а если вы используете представления на основе функций (FBVs), вам придется использовать декораторы или написать ограничения внутри функции.

Вот пример использования пользовательского декоратора с помощью FBV:

from functools import wraps
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404
from django.template.response import TemplateResponse

from .models import YourModelClass


def user_permission_test(function):
    """
    Decorator to check if the requesting user is either a superuser
    or owns the object
    """

    @wraps(function)
    def decorator(request, **kwargs):

        object = None
        pk = kwargs.get("pk", None)
        object = get_object_or_404(YourModelClass, pk=pk)
        
        if (not request.user.is_superuser) and (request.user != object.owner):
            raise PermissionDenied()

        return function(request, **kwargs)

    return decorator


@login_required # this decorator makes sure that only logged-in users can access this view
@user_permission_test # this decorator makes sure that either the user is a superuser or owns the object
def detail(request, **kwargs):
    """
    Detail view
    """
    pk = kwargs.get("pk", None)
    object = get_object_or_404(YourModelClass, pk=pk)

    context = {"object": object}

    return TemplateResponse(
        request,
        template="yourapp/detail.html",
        context=context,
    )

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

from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404
from django.template.response import TemplateResponse

from .models import YourModelClass


@login_required # this decorator makes sure that only logged-in users can access this view
def detail(request, **kwargs):
    """
    Detail view
    """
    pk = kwargs.get("pk", None)
    object = get_object_or_404(YourModelClass, pk=pk)
    
    # here is the test to check the permissions
    if (not request.user.is_superuser) and (request.user != object.owner):
        raise PermissionDenied()

    context = {"object": object}

    return TemplateResponse(
        request,
        template="yourapp/detail.html",
        context=context,
    )

Для пользователя staff вы можете использовать следующий декоратор:

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def yourview(request, pk):
    ....
Вернуться на верх