Sto cercando di integrare django validators 1.9 con i serializzatori del framework django rest. Ma l''utente' serializzato (del framework django rest) non è compatibile con i validatori di django.integrare validatori di password django con framework django validate_password
Ecco la 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
sono riuscito ad ottenere MinimumLengthValidator e NumericPasswordValidator corretto perché sia la funzione di convalida non usare 'utente' nel convalidare. Il codice sorgente è here
Estratto dal codice sorgente django:
def validate(self, password, user=None):
if password.isdigit():
raise ValidationError(
_("This password is entirely numeric."),
code='password_entirely_numeric',
)
Per altri validatori come UserAttributeSimilarityValidator, la funzione utilizza un altro argomento 'utente' in validazione ('user' è Django modello User, se io' m non è sbagliato)
Estratto dal codice sorgente django:
def validate(self, password, user=None):
if not user:
return
for attribute_name in self.user_attributes:
value = getattr(user, attribute_name, None)
Come posso cambiare serializ Ed utente in quello che Django validatori (UserAttributeSimilarityValidator) può vedere
Estratto dal codice sorgente 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
Modifica
Django Resto quadro può ottenere tutti i Django di built-in convalida della password (ma è come un hack). Ecco un problema:
Il validationError è come questo
[ValidationError ([ 'Questa password è troppo corta Si deve contenere almeno 8 caratteri..']), ValidationError ([ 'Questa password è interamente numerico. '])]
La convalida non contiene un campo. framework Django resto lo vedono come
{
"non_field_errors": [
"This password is too short. It must contain at least 8 characters.",
"This password is entirely numeric."
]
}
Come posso iniettare un campo al raise ValidationError
Ci sono un paio di errore di battitura nel codice. A proposito, la tua soluzione funziona bene sulla validazione, ma il framework django non può ottenere il nome del campo da qui i non_field_errors ---> { "non_field_errors": [ "La password è troppo simile all'email.", " Questa password è troppo corta. Deve contenere almeno 8 caratteri. " ] } – momokjaaaaa
In realtà non ho testato il codice, quindi potrebbero esserci alcuni refusi qua e là ma ciò non dovrebbe impedirti di utilizzare e testare correttamente questo codice. Riguardo a 'NON_FIELD_ERRORS' ho aggiornato la mia risposta e ora gli errori evidenziati dovrebbero contenere il nome del campo' password' come chiave per quegli errori. – AKS
Ricordare che '** data' potrebbe non includere tutti i campi obbligatori per creare l'oggetto utente quando si eseguono aggiornamenti parziali (' PATCH'). – faph