Django-rest-auth(dj-rest-auth)自定义用户注册

7
我正在使用dj-rest-auth (https://dj-rest-auth.readthedocs.io/en/latest/),并尝试实现一个自定义注册表单。当我尝试注册新用户时,我只有基础表格。 我曾经看过旧版本的(https://django-rest-auth.readthedocs.io/en/latest/),如果您使用password1和password2,则无需重复输入所有代码。
serializers.py
from rest_framework import serializers
from dj_rest_auth.registration.serializers import RegisterSerializer


class CustomRegisterSerializer(RegisterSerializer):
    first_name = serializers.CharField()
    last_name = serializers.CharField()

    def get_cleaned_data(self):
        super(CustomRegisterSerializer, self).get_cleaned_data()
        return {
            'username': self.validated_data.get('username', ''),
            'password1': self.validated_data.get('password1', ''),
            'password2': self.validated_data.get('password2', ''),
            'email': self.validated_data.get('email', ''),
            'first_name': self.validated_data.get('first_name', ''),
            'last_name': self.validated_data.get('last_name', '')
        }

settings.py

REST_AUTH_SERIALIZERS = {
    'REGISTER_SERIALIZER': 'accounts.serializers.CustomRegisterSerializer',
}
3个回答

10
问题出现在settings.py文件中:
REST_AUTH_REGISTER_SERIALIZERS = {
    'REGISTER_SERIALIZER': 'accounts.serializers.CustomRegisterSerializer'
}

1
需要在2023年使用REST_AUTH = {,如此处所述:https://dj-rest-auth.readthedocs.io/en/latest/configuration.html - art_hq

3
现在它应该在settings.py文件的REST_AUTH对象中。
REST_AUTH = {
   "REGISTER_SERIALIZER":"users.api.serializers.CusomRegisterSerializer"
}

与新的软件包配合得很好。 - Aleem

1
你可以创建自己的用户并将其设置为项目的 AUTH_USER_MODEL,方法如下:
from django.contrib.auth.models import AbstractUser, BaseUserManager


class MyUserManager(BaseUserManager):
    def create_user(self, email, username,first_name, last_name, password=None):
        user = self.model(
            email=self.normalize_email(email),
            username=username,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self,email, username, password, first_name, last_name, is_tutor, is_student):
        user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            password=password,
            first_name=first_name,
            last_name=last_name,
        )

        user.is_staff = True
        user.is_admin = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    email =             models.EmailField(verbose_name='email', max_length=60, unique=True)
    username =          models.CharField(max_length=30, unique=True)
    date_joined =       models.DateField(verbose_name='date joined', auto_now_add=True)
    last_login =        models.DateField(verbose_name='last login', auto_now=True)
    is_admin =          models.BooleanField(default=False)
    is_active =         models.BooleanField(default=True)
    is_staff =          models.BooleanField(default=False)
    is_superuser =      models.BooleanField(default=False)
    rating =            models.FloatField(default=0, blank=True, null=True)
    reviews_count =     models.IntegerField(default=0)
    first_name =        models.CharField(verbose_name='first_name', max_length=30)
    last_name =         models.CharField(verbose_name='last_name', max_length=30)

    USERNAME_FIELD = 'email' 
#this field means that when you try to sign in the username field will be the email 
#change it to whatever you want django to see as the username when authenticating the user
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name',]

    objects = MyUserManager()

    def __str__(self):
        return self.first_name + ' - ' + self.email

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True


接下来,在settings.py中声明AUTH_USER_MODEL =“刚创建的模型名称”,并在serializers.py中为用户注册创建一个序列化器:

class UserRegistrationSerializer(serializers.ModelSerializer):

    password2 = serializers.CharField(style={'input_type':'password'}, write_only=True)

    class Meta:
        model = User
        fields = ['username', 'email', 'first_name','last_name',
        'password', 'password2',]
        extra_kwargs = {
            'password': {
                'write_only':True
            }
        }

    def save(self):
        user = User(
            email=self.validated_data['email'],
            username=self.validated_data['username'],
            first_name=self.validated_data['first_name'],
            last_name=self.validated_data['last_name'],
            is_tutor=self.validated_data['is_tutor'],
            is_student=self.validated_data['is_student'],
        )

        password = self.validated_data['password']
        password2 = self.validated_data['password2']

        if password != password2:
            raise serializers.ValidationError({'password':'Passwords must match.'})
        user.set_password(password)
        user.save()
        return user

然后您需要在Django管理界面中注册您的自定义用户模型。
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

class AccountAdmin(UserAdmin):
    list_display = ('email', 'username','pk', 'date_joined', 'last_login', 'is_admin', 'is_staff')
    search_fields = ('email', 'username')
    readonly_fields = ('date_joined', 'last_login')

    filter_horizontal = ()
    list_filter = ()
    fieldsets = ()

admin.site.register(User, AccountAdmin)

我希望这能帮到你,或者至少指引你朝着想要的方向前进。


如何在您的代码中自定义发送电子邮件进行电子邮件验证?或者它将如何适应其中? - alpha027

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接