【发布时间】:2021-06-17 14:53:15
【问题描述】:
我正在尝试将 django validators 1.9 与 django rest 框架序列化程序集成。但是序列化的“用户”(django rest 框架)与 django 验证器不兼容。
这里是serializers.py
import django.contrib.auth.password_validation as validators
from rest_framework import serializers
class RegisterUserSerializer(serializers.ModelSerializer):
password = serializers.CharField(style={'input_type': 'password'}, write_only=True)
class Meta:
model = User
fields = ('id', 'username', 'email, 'password')
def validate_password(self, data):
validators.validate_password(password=data, user=User)
return data
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
user.is_active = False
user.save()
return user
我设法使 MinimumLengthValidator 和 NumericPasswordValidator 正确,因为这两个函数 validate 都不使用“用户”进行验证。源代码为here
摘自django源码:
def validate(self, password, user=None):
if password.isdigit():
raise ValidationError(
_("This password is entirely numeric."),
code='password_entirely_numeric',
)
对于像 UserAttributeSimilarityValidator 这样的其他验证器,该函数在验证时使用另一个参数 'user'('user' 是 django 用户模型,如果我没记错的话)
摘自django源码:
def validate(self, password, user=None):
if not user:
return
for attribute_name in self.user_attributes:
value = getattr(user, attribute_name, None)
如何将序列化的用户更改为 django 验证器(UserAttributeSimilarityValidator)可以看到的内容
摘自django源码:
def validate(self, password, user=None):
if not user:
return
for attribute_name in self.user_attributes:
value = getattr(user, attribute_name, None)
if not value or not isinstance(value, string_types):
continue
编辑
Django Rest Framework 可以获得 Django 的所有内置密码验证(但它就像一个 hack)。这里有一个问题:
validationError是这样的
[ValidationError(['这个密码太短。它必须包含在 最少 8 个字符。']), ValidationError(['这个密码完全是 数字。'])]
验证不包含字段。 Django rest framework 将其视为
{
"non_field_errors": [
"This password is too short. It must contain at least 8 characters.",
"This password is entirely numeric."
]
}
如何在raise ValidationError 注入字段
【问题讨论】:
标签: django validation django-rest-framework