2015-01-28 16 views
8

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.

risposta

7

Il modo più semplice per modificare lo stile di errore attraverso tutta la vista nell'applicazione è utilizzare sempre serializer.is_valid(raise_exception=True) e quindi implementare un custom exception handler che definisce come viene creata la risposta all'errore.

+0

Sì, funziona !, Non posso ringraziarti abbastanza Tom :) –

+0

Prego! –

+0

Per un approccio diverso, vedere http://stackoverflow.com/questions/26943985/custom-error-messages-in-django-rest-framework-serializer – frnhr

Problemi correlati