Tôi đang cố gắng tích hợp django validators 1.9 với bộ nối tiếp khung còn lại django. Nhưng serialized 'user' (của django rest framework) không tương thích với các trình xác nhận django.tích hợp trình xác nhận mật khẩu django với khung công tác còn lại django validate_password
Đây là 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
tôi quản lý để có được MinimumLengthValidator và NumericPasswordValidator đúng vì cả hai chức năng validate không sử dụng 'người dùng trong việc chứng thực. Mã nguồn here
Trích từ mã nguồn django:
def validate(self, password, user=None):
if password.isdigit():
raise ValidationError(
_("This password is entirely numeric."),
code='password_entirely_numeric',
)
Đối với xác nhận khác như UserAttributeSimilarityValidator, chức năng sử dụng một số khác tranh luận 'user' trong việc chứng thực ('sử dụng' được django mô hình dùng, nếu tôi m không sai)
Trích từ mã nguồn django:
def validate(self, password, user=None):
if not user:
return
for attribute_name in self.user_attributes:
value = getattr(user, attribute_name, None)
Làm thế nào tôi có thể thay đổi serializ ed tài vào những gì django xác nhận (UserAttributeSimilarityValidator) có thể thấy
Trích từ mã nguồn 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
Sửa
Django Nghỉ ngơi Framework có thể nhận được tất cả Django tích hợp trong xác nhận mật khẩu (nhưng nó giống như một hack). Dưới đây là một vấn đề:
Các validationError là như thế này
[ValidationError ([ 'password này là quá ngắn Nó phải chứa ít ít nhất 8 ký tự..']), ValidationError ([ 'password Đây là hoàn toàn số. '])]
Xác thực không chứa trường. Django khuôn khổ còn lại xem nó như là
{
"non_field_errors": [
"This password is too short. It must contain at least 8 characters.",
"This password is entirely numeric."
]
}
Làm thế nào tôi có thể tiêm một thực tế tại raise ValidationError
Có một vài lỗi đánh máy trong mã của bạn. Bằng cách này, giải pháp của bạn hoạt động tốt trên xác thực nhưng khung thời gian còn lại của django không thể lấy tên trường do đó non_field_errors ---> { "non_field_errors": [ "Mật khẩu quá giống với email.", " Mật khẩu này quá ngắn. Mật khẩu phải chứa ít nhất 8 ký tự. " ] } – momokjaaaaa
Tôi chưa thực sự kiểm tra mã để có thể có một số lỗi chính tả ở đây và ở đó nhưng điều đó sẽ không ngăn bạn sử dụng và kiểm tra mã này đúng cách. Về 'NON_FIELD_ERRORS' tôi đã cập nhật câu trả lời của mình và bây giờ các lỗi được nêu ra phải chứa tên trường' password' làm khóa cho các lỗi đó. – AKS
Ghi nhớ rằng '** dữ liệu' có thể không bao gồm tất cả các trường bắt buộc để tạo đối tượng người dùng khi thực hiện cập nhật một phần (' PATCH'). – faph