Я создаю функциональность, в которой модель проекта / витрины имеет администраторов ManyToManyField
, которая будет содержать список пользователей, которые могут управлять проектом.
У меня возникают проблемы при добавлении пользователей в это поле ( пользователь будет получен из пользовательского ввода с внешнего интерфейса). Мне удалось назначить человека, который создает проект по умолчанию, администратором, но добавить других администраторов не удалось.
models.py
class Showcase(models.Model):
title = models.CharField(max_length=50)
description = models.TextField(null=True)
skill_type = models.ForeignKey(Skill, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="Showcases")
content = models.TextField(null=True)
created_on = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True)
voters = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="upvotes")
slug = models.SlugField(max_length=255, unique=True)
administrator = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="administrators", blank=True)
serializers.py
class ShowcaseAdminSerializer(serializers.ModelSerializer):
class Meta:
model = Showcase
fields = ['administrator',]
С представлением ниже я хотел, чтобы только администраторы могли добавлять новых администраторов в витрину. Добавляемый пользователь будет получен из внешнего интерфейса ввода вместо URL (я надеюсь, что эта часть понятна). views.py
class showcaseAddAdminAPIView(APIView):
'''
Add a user as an admin to a showcase
'''
serializer_class = ShowcaseAdminSerializer
permission_classes = [IsAdmin]
def post(self, request, slug):
showcase = get_object_or_404(Showcase, slug=slug)
if request.user in showcase.administrator.all():
showcase.administrator.add(user.slug)
showcase.save()
serializer = self.serializer_class(showcase)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
с учетом вышесказанного, мне было интересно, если проверка на то, является ли пользователь администратором, прежде чем он сможет выполнить действие, должна также выполняться с использованием разрешений. Ниже у меня есть разрешение, которое не работает.
urls.py
path("<slug:slug>/addadmin/", qv.showcaseAddAdminApiview.as_view(), name="add-administrator-to-showcase"),
права доступа
class IsAdmin(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return False
return obj.administrator == request.user
Я попытался использовать это разрешение, чтобы администратор мог добавить только администраторов. Админ на витрине. но это не работает.