繁体   English   中英

覆盖rest-auth RegisterSerializer,添加年龄验证

[英]Overwriting rest-auth RegisterSerializer, add age validation

我正在尝试通过rest-auth为用户验证年龄。 我设法添加了字段并在注册期间保存了该字段,但是现在我很难验证年龄是否小于18岁。有人可以指出我应该怎么做吗? 我已经尝试使用@property方法通过AbstractUser模型进行验证,并且在注册过程中引发了ValidationError ,但是无论如何,用户帐户都在保存,由于ValidationError ,我无法访问用户详细信息视图,所以我来我只希望防止通过验证进行注册的结论,但在我的情况下不起作用。

class RegisterSerializer(serializers.Serializer):
    username = serializers.CharField(
        max_length=get_username_max_length(),
        min_length=allauth_settings.USERNAME_MIN_LENGTH,
        required=allauth_settings.USERNAME_REQUIRED
    )
    email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
    date_of_birthday = serializers.DateField() ### ADDED BY ME
    password1 = serializers.CharField(write_only=True)
    password2 = serializers.CharField(write_only=True)

    def validate_username(self, username):
        username = get_adapter().clean_username(username)
        return username

    def validate_email(self, email):
        email = get_adapter().clean_email(email)
        if allauth_settings.UNIQUE_EMAIL:
            if email and email_address_exists(email):
                raise serializers.ValidationError(
                    _("A user is already registered with this e-mail address."))
        return email

    def validate_age(self, date_of_birthday): ### ADDED BY ME
        age = relativedelta(datetime.now(), date_of_birthday).years

        if age < 18:
            raise serializers.ValidationError('Must be at least 18 years old to register.')
        else:
            return age

    def validate_password1(self, password):
        return get_adapter().clean_password(password)

    def validate(self, data):
        if data['password1'] != data['password2']:
            raise serializers.ValidationError(_("The two password fields didn't match."))
        return data

    def custom_signup(self, request, user):
        pass

    def get_cleaned_data(self):
        return {
            'username': self.validated_data.get('username', ''),
            'date_of_birthday': self.validated_data.get('date_of_birthday', ''), ### ADDED BY ME
            'password1': self.validated_data.get('password1', ''),
            'email': self.validated_data.get('email', '')
        }

    def save(self, request):
        adapter = get_adapter()
        user = adapter.new_user(request)
        self.cleaned_data = self.get_cleaned_data()
        adapter.save_user(request, user, self)
        self.custom_signup(request, user)
        setup_user_email(request, user, [])
        user.date_of_birth = self.cleaned_data.get('date_of_birthday') ### ADDED BY ME
        user.save() ### ADDED BY ME
        return user

您可以通过定义在字段名称前添加validate_方法来验证序列化程序字段。 您的情况下,将validate_age替换为validate_date_of_birthday

def validate_date_of_birthday(self, date_of_birthday):
    age = relativedelta(datetime.now(), date_of_birthday).years

    if age < 18:
        raise serializers.ValidationError('Must be at least 18 years old to register.')
    else:
        return date_of_birthday

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM