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

У меня проблемы с тем, как реализовать сценарий, над которым я работаю. Я новичок в веб-разработке, поэтому прошу простить мою наивность.
Я использую стандартную панель администратора Django, где я вошел в систему с помощью созданного мной супер-администратора. Приложение не имеет вида регистрации, поэтому только администратор сможет создавать новых пользователей. Обычные пользователи получат электронное письмо с их учетными данными. Чтобы они могли войти в систему через LoginAPIView.

views.py

class LoginView(APIView):
    serializer_class = LoginSerializer

    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

serializers.py

class LoginSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(max_length=255)
    password = serializers.CharField(min_length=8, write_only=True)


    class Meta:
        model = User
        fields = ["email", "password"]

    def validate(self, attrs):
        email = attrs.get("email")
        password = attrs.get("password")
        user = auth.authenticate(username=email, password=password)

        if not user:
            raise AuthenticationFailed("Invalid credentials")

        if not user.is_active:
            raise AuthenticationFailed("Account is not active, please contain admin")

        return {"email": user.email}

models.py

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **kwargs):
        if not email or not password:
            raise ValueError("Users must have both email and password")

        email = self.normalize_email(email).lower()

        user = self.model(email=email, **kwargs)
        user.set_password(password)
        user.save()

        return user

    def create_superuser(self, email, password, **extra_fields):
        if not password:
            raise ValueError("Password is required")

        user = self.create_user(email, password)
        user.is_superuser = True
        user.is_staff = True
        user.save()

        return user


class User(AbstractBaseUser, PermissionsMixin):
    # user data
    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

    # status
    is_active = models.BooleanField(default=True)
    is_verified = models.BooleanField(default=False)

    # timestamps
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = UserManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["first_name", "last_name"]

    def __str__(self):
        return self.email

admin.py

from django.contrib import admin

from authentication.models import User


@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = ("email", "first_name","last_name")

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

views.py

class SignUpView(APIView):
    serializer_class = RegisterSerializer

    def post(self, request, *args):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        user_data = serializer.data

        return Response(user_data, status=status.HTTP_201_CREATED)

Заранее спасибо!

Вы можете использовать действия администратора, которые отправляют электронные письма с помощью функции send_email, когда создается учетная запись.

Действия администратора - https://docs.djangoproject.com/en/3.2/ref/contrib/admin/actions/

send_email - https://docs.djangoproject.com/en/4.1/topics/email/

Вернуться на верх