#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