2015-01-28 11 views
8

Ich möchte das JSON ändern, das rest_framework oder django zurückgibt, wenn ein Validierungsfehler auftritt.Wie können Validierungsfehlerreaktionen in DRF geändert werden?

Ich werde eine meiner Ansichten als Beispiel verwenden, aber ich möchte Fehlermeldungen für alle meine Ansichten ändern. Sagen wir also, ich möchte mit dieser Ansicht Benutzer anmelden und E-Mail und Passwort angeben. Wenn diese korrekt sind, wird access_token zurückgegeben.

Wenn ich nur das Kennwort schreiben, gibt es Fehler 400:

{"email": ["This field is required."]} 

und wenn Passwort und E-Mail nicht match:

{"detail": ["Unable to log in with provided credentials."]} 

, was ich will wäre wie:

{"errors": [{"field": "email", "message": "This field is required."}]} 

{"errors": [{"non-field-error": "Unable to log in with provided credentials."}]} 

Jetzt ist dies meine Ansicht:

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) 

kann ich auf die serializer.errors und verändern sie, aber es sieht aus wie nur Feldfehler können auf diese Weise zugegriffen werden, wie auch in meinem serializer`s validieren Methode erstellt Validierungsfehler ändern?

Das ist mein Serializer (es ist das gleiche wie Serializer rest_framework.authtoken.serializers.AuthTokenSerializer), aber bearbeitet, so Authentifizierung muß nicht Benutzername erfordern, aber E-Mail:

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) 

Oder vielleicht ist es eine ganz andere Ansatz? Ich werde wirklich für irgendwelche Ideen dankbar sein.

Antwort

7

Die einfachste Methode zum Ändern des Fehlerstils über die gesamte Ansicht in Ihrer Anwendung besteht darin, immer serializer.is_valid(raise_exception=True) zu verwenden und dann eine custom exception handler zu implementieren, die definiert, wie die Fehlerreaktion erstellt wird.

+0

Ou yeah, es funktioniert !, Ich kann dir nicht genug danken Tom :) –

+0

Gern geschehen! –

+0

Für einen anderen Ansatz siehe http://stackoverflow.com/questions/26943985/custom-error-messages-in-django-rest-framework-serializer – frnhr

Verwandte Themen