Как Django rest IsAdminUser не проходит, даже если пользователь является администратором?
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')
Здесь я пытаюсь сделать так, чтобы администратор видел всех клиентов, а клиент видел только свои данные, ... но я не смог найти, почему я не могу видеть всех клиентов из списка как администратор, я продолжаю получать сообщение о том, что я не авторизован для доступа к этой конечной точке...
`
urls.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"),
]
Здесь я пытаюсь сделать так, чтобы администратор видел всех клиентов, а клиент видел только свои данные, ... но я не смог найти, почему я не могу видеть всех клиентов из списка как администратор, я продолжаю получать сообщение о том, что я не авторизован для доступа к этой конечной точке... любая помощь, пожалуйста?
Проблема в том, что вы определили свою модель Admin
из обычной модели Django, поэтому Django не может найти разрешения пользователя, связанные с ней.
Вы должны наследовать от модели пользователя аутентификации Django (AbstractUser
или AbstractBaseUser
), как указано в документации .
Например, вы можете сделать:
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
приложения.