django validators 1.9をdjango rest frameworkシリアライザと統合しようとしています。しかし、シリアル化された 'ユーザー'(django rest frameworkの)はdjangoバリデーターと互換性がありません。ここでdjangoのパスワードバリデーターをdjango rest frameworkと統合するvalidate_password
は、両方の機能の検証は、検証で「ユーザー」を使用していないので、私はMinimumLengthValidatorとNumericPasswordValidatorが正しい得ることができた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
です。ソースコードはDjangoのソースコードからhere
の抜粋です:UserAttributeSimilarityValidatorのような他のバリデータについては
def validate(self, password, user=None):
if password.isdigit():
raise ValidationError(
_("This password is entirely numeric."),
code='password_entirely_numeric',
)
、機能が有効で、別の1つの引数「ユーザー」を使用して、私は「場合(「ユーザー」は、DjangoのUserモデルであります間違っていないメートル)Djangoのソースコードから
抜粋:
def validate(self, password, user=None):
if not user:
return
for attribute_name in self.user_attributes:
value = getattr(user, attribute_name, None)
がどのように私はSERIALIZを変更することができます何ジャンゴバリ(UserAttributeSimilarityValidator)へのEDユーザーは、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)
if not value or not isinstance(value, string_types):
continue
編集
Djangoの残りのフレームワークをビルトインパスワードの検証(ただし、ハックのようなものです)。 ValidationErrorをこの
のようなものです
[ValidationErrorを([ 'このパスワードが短すぎることが 8文字以上で含まれている必要があります。。'])、ValidationErrorを([ 'このパスワードは、次のとおりです。ここで問題です完全に 数字] '])]
検証にはフィールドが含まれていません。 Djangoの残りのフレームワークあなたが言及した同様
{
"non_field_errors": [
"This password is too short. It must contain at least 8 characters.",
"This password is entirely numeric."
]
}
として、それを参照してくださいどのように私はあなたがUserAttributeSimilarityValidator
バリデータを使用してvalidate_password
方法でpassword
を検証するとき、あなたはuser
オブジェクトを持っていない、raise ValidationError
あなたの検証に を「はSequenceMatcher」を含める必要があります。ちなみに、あなたのソリューションは検証では正常に動作しますが、django restフレームワークはフィールド名を取得できません。したがって、non_field_errors ---> { "non_field_errors":[ "パスワードは電子メールに似ています。"、 "このパスワードは短すぎます。パスワードは8文字以上である必要があります。 ] } – momokjaaaaa
私は実際にコードをテストしていないので、ここにいくつかのタイプミスがあるかもしれませんが、このコードを正しく使用しテストするのを止めてはいけません。 'NON_FIELD_ERRORS'について私は私の答えを更新しました。そして、発生したエラーは、それらのエラーのキーとして' password'フィールド名を含むべきです。 – AKS
部分的( 'PATCH')の更新を行うときに、' ** data'にユーザオブジェクトを作成するために必要なすべてのフィールドが含まれているとは限りません。 – faph