我的模型.py:
import uuid
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
class UserManager(BaseUserManager):
"""Define a model manager for User model with no username field."""
use_in_migrations = True
def _create_user(self, email, password, **extra_fields):
"""Create and save a User with the given email and password."""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, **extra_fields):
"""Create and save a regular User with the given email and password."""
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
"""Create and save a SuperUser with the given email and password."""
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', 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)
class UserModel(AbstractUser):
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False,
)
username = None
email = models.EmailField(
verbose_name='Электронная почта',
max_length=254,
null=False,
blank=False,
unique=True,
)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
password = models.CharField(
verbose_name='Пароль',
max_length=254,
null=False,
blank=False,
)
delivery_address = models.CharField(
verbose_name='Адрес доставки',
max_length=254,
blank=True,
)
phone_number = models.CharField(
verbose_name='Номер телефона',
max_length=254,
blank=True,
)
objects = UserManager()
class Meta:
verbose_name = 'Пользователь'
verbose_name_plural = 'Пользователи'
def __str__(self):
return self.email
我的序列化程序.py:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = UserModel
exclude = ('password', 'is_superuser', 'is_staff',
'groups', 'user_permissions')
class RegisterSerializer(serializers.ModelSerializer):
email = serializers.EmailField(required=True, validators=[
UniqueValidator(queryset=UserModel.objects.all().values_list('email'))])
password = serializers.CharField(
write_only=True, required=True, validators=[validate_password])
password2 = serializers.CharField(write_only=True, required=True)
class Meta:
model = UserModel
fields = ('email', 'password', 'password2')
def validate(self, attrs):
if attrs['password'] != attrs['password2']:
raise serializers.ValidationError(
{"password": "Пароли не совпадают!"})
return attrs
def create(self, validated_data):
user = UserModel.objects.create(email=validated_data['email'],)
user.set_password(validated_data['password'])
user.save()
return user
我的 views.py(我认为,我必须在这里做一些事情,但不完全是做什么):
class UserAPIView(viewsets.ModelViewSet):
queryset = UserModel.objects.all()
serializer_class = UserSerializer
# Class based view to register user
class RegisterUserAPIView(generics.CreateAPIView):
permission_classes = (AllowAny,)
serializer_class = RegisterSerializer
my urls.py(toke-urls 来自 simple-jwt):
app_name = 'users'
users_router = routers.SimpleRouter()
users_router.register('users', UserAPIView)
urlpatterns = [
path('', include(users_router.urls)),
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('token/verify/', TokenVerifyView.as_view(), name='token_verify'),
path('register/', RegisterUserAPIView.as_view()),
]
我有使用电子邮件而不是用户名的自定义用户。 JWT 与 simple-jwt。注册后如何自动登录用户?
我什至不知道从哪里开始