Desidero modificare il JSON, che rest_framework o django restituisce quando si verifica un errore di convalida.Come modificare le risposte degli errori di convalida in DRF?
Userò una delle mie visualizzazioni come esempio, ma voglio cambiare i messaggi di errore per tutte le mie viste. Quindi diciamo che ho questo punto di vista per accedere agli utenti, fornendo e-mail e password. Se questi sono corretti, restituisce access_token.
Se inserisco solo la password, si restituisce l'errore 400:
{"email": ["This field is required."]}
e se la password e-mail dont partita:
{"detail": ["Unable to log in with provided credentials."]}
cosa voglio sarebbe più simile:
{"errors": [{"field": "email", "message": "This field is required."}]}
{"errors": [{"non-field-error": "Unable to log in with provided credentials."}]}
Ora questa è la mia vista :
class OurLoginObtainAuthToken(APIView):
permission_classes = (AllowAny,)
serializer_class = serializers.AuthTokenSerializer
model = Token
def post(self, request):
serializer = self.serializer_class(data=request.DATA)
if serializer.is_valid():
#some magic
return Response(token)
return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)
posso accedere ai serializer.errors e modificarli, ma sembra che solo errori sul campo si può accedere in questo modo, come cambiare anche gli errori di convalida creati nei miei serializer`s validare metodo?
Questo è il mio serializer (è la stessa come serializzatore rest_framework.authtoken.serializers.AuthTokenSerializer) ma modificato, quindi l'autenticazione doesnt richiede nome utente e-mail, ma:
class AuthTokenSerializer(serializers.Serializer):
email = serializers.CharField()
password = serializers.CharField()
def validate(self, attrs):
email = attrs.get('email')
password = attrs.get('password')
#print email
#print password
if email and password:
user = authenticate(email=email, password=password)
if user:
if not user.is_active:
msg = _('User account is disabled.')
raise ValidationError(msg)
attrs['user'] = user
return attrs
else:
msg = _('Unable to log in with provided credentials.')
raise ValidationError(msg)
else:
msg = _('Must include "username" and "password"')
raise ValidationError(msg)
O forse c'è una completamente diversa approccio? Sarò davvero grato per qualsiasi idea.
Sì, funziona !, Non posso ringraziarti abbastanza Tom :) –
Prego! –
Per un approccio diverso, vedere http://stackoverflow.com/questions/26943985/custom-error-messages-in-django-rest-framework-serializer – frnhr