Я расширил модель AbstractUser. Но я не могу войти в систему, используя имя пользователя и пароль.
Я создаю API для регистрации. На основе имени пользователя и пароля мне нужно выполнить вход в систему. Но он говорит, что пользователь не найден.
Model.py
class User(AbstractUser):
"""This Class is used to extend the in-build user model """
ROLE_CHOICES = (('CREATOR','CREATOR'),('MODERATOR','MODERATOR'),('USERS','USERS'))
GENDER_CHOICES = (('MALE','MALE'),('FEMALE',"FEMALE"),('OTHER','OTHER'))
date_of_birth = models.DateField(max_length=10, verbose_name='Date of Birth', null=True)
profile_image = models.ImageField(upload_to='profile_images', verbose_name='Profile Image', default='images/default.webp', blank=True)
bio = models.TextField(verbose_name='Bio')
role = models.CharField(max_length=10, verbose_name='Role', choices=ROLE_CHOICES)
gender = models.CharField(max_length=6, verbose_name='Gender', choices=GENDER_CHOICES)
serializers.py
class LoginSerializer(serializers.ModelSerializer):
username = serializers.CharField(max_length=25)
password = serializers.CharField(max_length=25)
class Meta:
model = User
fields = ('username','password')
def validate(self, **kwargs):
username = self.validated_data.get("username", None)
password = self.validated_data.get("password", None)
print(username)
print(password)
user = authenticate(username=username, password=password)
print(user)
if user is None:
raise serializers.ValidationError('User Not Found')
else:
return Response({'username':'ronaldo'})
views.py
class UserLoginAPI(viewsets.ModelViewSet):
serializer_class = LoginSerializer
queryset = User.objects.all()
def post(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
response = {
'success':'True',
'status_code':status.HTTP_200_OK,
'message':'Login Successfully',
}
status_code = status.HTTP_200_OK
return Response(response, status=status_code)
Мне кажется, я делаю это неправильно. Поскольку я использую инструментарий OAuth2 для генерации токена. Поэтому, пожалуйста, помогите
AttributeError: 'NoneType' object has no attribute '_meta'
Попробуйте следующее, используйте метод create вместо post в viewset и вызовите self.perform_create(serializer) для вызова метода 'create' в сериализаторе.
class UserLoginAPI(viewsets.ModelViewSet):
serializer_class = LoginSerializer
queryset = User.objects.all()
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
response = {
'success':'True',
'status_code':status.HTTP_200_OK,
'message':'Login Successfully',
}
status_code = status.HTTP_200_OK
return Response(response, status=status_code)
class LoginSerializer(serializers.ModelSerializer):
username = serializers.CharField(max_length=25)
password = serializers.CharField(max_length=25)
class Meta:
model = User
fields = ('username','password')
def validate(self, **kwargs):
# some validation ( null check)
def create(self, validated_data):
username = self.validated_data.get("username", None)
password = self.validated_data.get("password", None)
print(username)
print(password)
user = authenticate(username=username, password=password)
print(user)
if user is None:
raise serializers.ValidationError('User Not Found')
return user