【问题标题】:How Django rest IsAdminUser does not pass even the user is admin?即使用户是管理员,Django rest IsAdminUser 如何不通过?
【发布时间】:2022-11-20 16:26:03
【问题描述】:
class Admin(models.Model):
    username = models.CharField(primary_key=True, max_length=30)
    password = models.CharField(max_length=255)
    email = models.EmailField(unique=True)
    created_on = models.DateTimeField(auto_now=True)
    django_user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='admin')
class AdminAPIViewSet(viewsets.ModelViewSet):
    queryset = Admin.objects.all()
    serializer_class = AdminSerializer
    permission_classes = [permissions.IsAdminUser]

    def get_queryset(self):
        if self.request.user.is_authenticated:
            return Admin.objects.filter(username=self.request.user.admin.username)
        else:
            return []

    def create(self, request, *args, **kwargs):
        serializer = AdminSerializer(data=request.data)
        if serializer.is_valid():
            email = serializer.data['email']
            username = serializer.data['email']
            password = serializer.data['password']

            with transaction.atomic():
                django_user = User.objects.create_user(username, email, password)
              
                admin = Admin.objects.create(**serializer.data, django_user=django_user)
                #User.objects.filter(pk=1001).update(is_superuser=True, is_staff=True)

                return Response(admin.pk)

        return Response('/error')


class ClientFullAccessAPIViewSet(viewsets.ModelViewSet):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer
    permission_classes = [permissions.IsAdminUser]

    def create(self, request, *args, **kwargs):
        serializer = ClientSerializer(data=request.data)
        if serializer.is_valid():
            email = serializer.data['email']
            username = serializer.data['email']
            password = serializer.data['password']

            with transaction.atomic():
                django_user = User.objects.create_user(username, email, password)
                client = Client.objects.create(**serializer.data, django_user=django_user)
                return Response(client.username)

        return Response('/error')

`这里我试图让管理员看到所有客户端,而客户端只看到他的数据,......但我找不到为什么我不能以管理员身份看到所有列表客户端,我一直没有得到授权访问此端点..

`

网址.py

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers

import user_management.views

router = routers.DefaultRouter()
router.register(r'clients', user_management.views.ClientReadOnlyAPIViewSet)
router.register(r'clientslist', user_management.views.ClientFullAccessAPIViewSet)
router.register(r'admin', user_management.views.AdminAPIViewSet)


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls')),
    path('api/v1/', include(router.urls)),
    #path('clients/', user_management.views.ClientAPIViewSet.as_view(), name="clients"),
]

`这里我试图让管理员看到所有客户端,而客户端只看到他的数据,......但我找不到为什么我不能以管理员身份看到所有列表客户端,我一直没有得到授权访问此端点..有什么帮助吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    问题是您从常规 Django 模型定义了您的 Admin 模型,因此 Django 无法找到与其关联的用户权限。

    您应该继承 Django 身份验证用户模型(AbstractUserAbstractBaseUser),如 the documentation 中所示。

    例如,你可以这样做:

    from django.contrib.auth.models import AbstractUser
    
    class CustomAdminUser(AbstractUser):
        # Here you normally only want to 
        # define the fields not defined in 
        # the base model AbstractUser
        pass 
    

    然后,创建您的管理员:

    CustomAdminUser.objects.create_superuser(...)
    

    最后但同样重要的是,两件重要的事情(在上面的 Django 文档的链接中提到):

    • 不要忘记将 AUTH_USER_MODEL 指向您的自定义用户模型。在创建任何迁移或首次运行 manage.py migrate 之前执行此操作。
    • 在应用程序的admin.py中注册模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 2012-08-07
      • 1970-01-01
      相关资源
      最近更新 更多