имя пользователя по-прежнему требуется o генерировать токен, даже если он удален из модели пользователя в перестройке django

#python #django #django-models #django-rest-framework #token

Вопрос:

У меня все еще возникает эта ошибка при попытке выполнить почтовый запрос от почтальона{«имя пользователя»:[«Это поле обязательно».]}. Пожалуйста, обратите внимание, что абстрактный класс пользователя был переопределен для поддержки аутентификации по электронной почте с именем пользователя = Нет. UserManager и UserAdmin также были переопределены

Models.py

     class User(AbstractUser):
       username = None
       email = models.EmailField(max_length=100, 
                            verbose_name='email', unique=True)
       USERNAME_FIELD = 'email'
       REQUIRED_FIELDS = []

   class UserManager(BaseUserManager):
       use_in_migrations = True
       def create_user(self, email, password, **extra_fields):
           if not email:
              raise ValueError(_('The Email must be set'))
              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, **extra_fields):
             extra_fields.setdefault('is_staff', True)
             extra_fields.setdefault('is_superuser', True)
             extra_fields.setdefault('is_active', True)
             if extra_fields.get('is_staff') is not True:
               raise ValueError(_('Superuser must have is_staff=True.'))
             if extra_fields.get('is_superuser') is not True:
                 raise ValueError(_('Superuser must have 
                              is_superuser=True.'))
             return self.create_user(email, password, **extra_fields)
 

Serializers.py

     class UserSerializer(serializers.ModelSerializer):
          photo = PhotoSerializer()
          class Meta:
             model = User
             fields = '__all__'
 

Views.py

     class AuthToken(ObtainAuthToken):
         username_field = 'email'
         def post(self, request, *args, **kwargs):
            serializer = self.serializer_class(data=request.data,
                                       context={'request': request})
            serializer.is_valid(raise_exception=True)
            user = serializer.validated_data['user']
            token, created = Token.objects.get_or_create(user=user)
            return Response({
                   'token': token.key,
                   'user_id': user.pk,
                   'email': user.email
            })
 

Admin.py

    class UserAdmin(DjangoUserAdmin):
       fieldsets = (
              (None, {'fields': ('email', 'password')}),
    
             (('Permissions'), {'fields': ('is_active', 'is_staff', 
                      'is_superuser','groups', 'user_permissions')}),)
         add_fieldsets = (
             (None, {
               'classes': ('wide',),
                'fields': ('email', 'password1', 'password2'),}),)
         list_display = ('email', 'first_name', 'last_name', 'is_staff')
         search_fields = ('email', 'first_name', 'last_name')
         ordering = ('email',)
 

Settings.py

     AUTH_USER_MODEL = "api.User"
    ACCOUNT_AUTHENTICATION_METHOD = 'email'
    ACCOUNT_USER_MODEL_USERNAME_FIELD = None
    ACCOUNT_EMAIL_REQUIRED = True
    ACCOUNT_USERNAME_REQUIRED = False
 

Комментарии:

1. Пожалуйста, добавьте свой вид и сериализатор

2. спасибо вам за ответ. Я добавил весь код

Ответ №1:

Проблема в том, что ваши поля в модельерализаторе установлены на все. Попробуйте использовать

    
class UserSerializer(serializers.ModelSerializer):
       photo = PhotoSerializer()
       class Meta:
          model = User
          exclude = ('username', )
 

Ответ №2:

это решило проблему:

     class AuthTokenSerializer(serializers.Serializer):
         email = serializers.EmailField(label=_("Email"))
         password = serializers.CharField(label=_("Password",),
         style={'input_type': 'password'},trim_whitespace=False)

         def validate(self, attrs):
             email = attrs.get('email')
             password = attrs.get('password')

             if email and password:
                 user = authenticate(request=self.context.get('request'),
                 email=email, password=password)

                  if not user:
                      msg = ('Unable to log in with provided 
                             credentials.')
                     raise 
                    serializers.ValidationError(msg,code='authorization')
             else:
                 msg = ('Must include "username" and "password".')
                 raise serializers.ValidationError(msg, 
                    code='authorization')

             attrs['user'] = user
             return attrs