'Django & Djoser 'NoneType' object has no attribute 'lower' 'NoneType' object has no attribute 'lower'
I keep having an error whenever I try to PATCH in order to update a specific user info. As per Djoser documentation, the endpoint is located in /users/me/
https://djoser.readthedocs.io/en/latest/base_endpoints.html#user
Everything is working fine except this part. I have a Custom User model and overrided the default (again, as per documentation) 'current_user': 'accounts.serializers.UserCreateSerializer',
serializer.py
class UserCreateSerializer(UserCreateSerializer):
class Meta(UserCreateSerializer.Meta):
model = User
read_only_fields = ('password'),
fields = ('id', 'email', 'first_name', 'last_name', 'is_active')
models.py
class UserAccountManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('Un email est obligatoire')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password):
user = self.create_user(email, password)
user.is_superuser = True
user.is_staff = True
user.save()
return user
class UserAccount(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=255, unique=True)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
phone = models.CharField(max_length=50)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
objects = UserAccountManager()
def get_full_name(self):
return self.first_name
def get_short_name(self):
return self.first_name
def __str__(self):
return self.email
What am I missing?
Edit with Traceback error
Environment:
Request Method: PATCH Request URL: http://127.0.0.1:8000/api/v1/users/me/
Django Version: 4.0 Python Version: 3.10.1 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'rest_framework.authtoken', 'corsheaders', 'djoser', 'companies', 'accounts'] Installed Middleware: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last): File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner response = get_response(request) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\rest_framework\viewsets.py", line 125, in view return self.dispatch(request, *args, **kwargs) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\rest_framework\views.py", line 509, in dispatch response = self.handle_exception(exc) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\rest_framework\views.py", line 469, in handle_exception self.raise_uncaught_exception(exc) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception raise exc File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\rest_framework\views.py", line 506, in dispatch response = handler(request, *args, **kwargs) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\djoser\views.py", line 175, in me return self.partial_update(request, *args, **kwargs) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\rest_framework\mixins.py", line 82, in partial_update return self.update(request, *args, **kwargs) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\rest_framework\mixins.py", line 67, in update serializer.is_valid(raise_exception=True) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\rest_framework\serializers.py", line 227, in is_valid self._validated_data = self.run_validation(self.initial_data) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\rest_framework\serializers.py", line 429, in run_validation value = self.validate(value) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\djoser\serializers.py", line 54, in validate validate_password(password, user) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\django\contrib\auth\password_validation.py", line 47, in validate_password validator.validate(password, user) File "C:\Users\minse\Desktop\Code snippets\Project\FluchtV0.4\env\lib\site-packages\django\contrib\auth\password_validation.py", line 145, in validate if SequenceMatcher(a=password.lower(), b=value_part.lower()).quick_ratio() >= self.max_similarity:
Exception Type: AttributeError at /api/v1/users/me/ Exception Value: 'NoneType' object has no attribute 'lower'
Solution 1:[1]
Hey I got the same error while override Djoser's UserCreateSerializer
This solution works fine for me
class CustomUserCreateSerializer(UserCreateSerializer):
password = serializers.CharField(style={"input_type": "password"}, write_only=True)
class Meta(UserCreateSerializer.Meta):
model = User
fields = ('email', 'id', 'username', 'first_name', 'last_name', 'password')
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Iu_Le |