Как изменить обязательные поля конечных точек DRF
Я использую jwt.io в своем DRF проекте. Как вы знаете, в jwt.io уже есть представление Login API под названием 'TokenObtainPairView', и оно требует 2 поля: имя пользователя и пароль. Но в нашем проекте мы хотим, чтобы пользователи входили в систему, используя свой email вместо имени пользователя. Я решаю эту задачу с помощью следующего кода:
class LoginAPIView(TokenObtainPairView):
def post(self, request, *args, **kwargs):
email=request.data['email']
request.POST._mutable = True
profile=ProfileModel.objects.get(email=email)
request.data['username']=profile.username
request.POST._mutable = False
return super().post(request, *args, **kwargs)
Это работает, но на моем swagger, когда разработчики front-end проверяют конечную точку, они видят, что конечная точка требует 2 поля: имя пользователя и пароль. Но я хочу, чтобы они видели обязательные поля, такие как email и пароль. Вот как выглядит моя конечная точка
Есть ли способ изменить его обязательные поля?
Думаю, если вам не нужно имя пользователя, вы можете определить свою собственную модель пользователя следующим образом.
Поле USERNAME_FIELD = 'email' в модели пользователя говорит Django, что нужно использовать email в качестве имени пользователя.
Не забудьте изменить settings.py для использования вашей собственной модели пользователя, добавив эту const: AUTH_USER_MODEL = 'users.User', где users - имя приложения, а User - имя модели.
from django.contrib.auth.models import (
AbstractBaseUser,
BaseUserManager,
PermissionsMixin
)
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
"""Creates and saves a new user"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(email=self.normalize_email(email), **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password):
if not email:
raise ValueError('Users must have an email address')
if not password:
raise ValueError('Users must have a password')
"""Creates and saves a new super user"""
user = self.create_user(email, password)
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class User(AbstractBaseUser, PermissionsMixin):
"""Custom user model that suppors using email instead of username"""
email = models.EmailField(max_length=255, unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
objects = UserManager()
USERNAME_FIELD = 'email'
По умолчанию TokenObtainPairSerializer
использует поле имени пользователя по умолчанию, определенное моделью, но если вам нужно изменить поведение без изменения модели, вы можете переопределить сериализатор токенов для использования предпочитаемого поля, т.е.:
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
username_field = 'email'
class LoginAPIView(TokenObtainPairView):
_serializer_class = CustomTokenObtainPairSerializer