2014-05-13 5 views
9

Chcę dostosować odpowiedź JSON podczas dodawania nowego elementu do bazy danych, który zwraca następujące.Jak skonfigurować Django Rest Framework do zwracania błędów z tekstem niestandardowym

HTTP 400 BAD REQUEST 
Content-Type: application/json Vary: 
Accept Allow: POST, OPTIONS 

{ 
"nick": [ 
    "Users with this Nick already exists." 
    ] 
} 

i

{ 
"nick": [ 
    "Your username is empty" 
    ] 
} 

chcę wrócić (ta nazwa już istnieje, proszę użyć innego.)

lub

"Username %s already exists", (self.nick) 

użyłem następujące próbki ale nie działa, jeśli wartość jest pusta lub nieprawidłowa.

def validate_title(self, attrs, source): 
    """ 
    Check that the blog post is about Django. 
    """ 
    value = attrs[source] 
    if "django" not in value.lower(): 
     raise serializers.ValidationError("Blog post is not about Django") 
    return attrs 

to JSON, który jest wysyłany do interfejsu API.

{ 
    "name": "myname", 
    "nick":"", 
    "type_account":"1", 
    "email":"[email protected]", 
    "pass_field":"12345" 
} 

serializers.py

class userSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = users 
     fields = ('nick', 'email', 'pass_field', 'type_account') 

    def validate_nick(self, attrs, source): 

     value = attrs[source] 
     if not value: 
      raise serializers.ValidationError('Username cannot be empty') 
     elif self.Meta.model.objects.filter(nick=value).exists(): 
      raise serializers.ValidationError("Username "+value+" is in use") 
     return attrs 

views.py

@api_view(['POST']) 
def user_add(request): 
    """ 
    Saves a new user on the database 
    """ 

    if request.method == 'POST': 

     serializer = userSerializer(data=request.DATA) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     else: 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
+0

Możesz opublikować modelu gdzie 'nick' jest pole? – Fiver

Odpowiedz

0

wierzę, coś jak poniżej będzie działać:

def validate_nick(self, attrs, source): 
    """ 
    Check that 'nick' is not already used or empty. 
    """ 
    value = attrs[source] 
    if not value: 
     raise serializers.ValidationError("Nick cannot be empty!") 
    elif self.Meta.model.objects.filter(nick=value).exists(): 
     raise serializers.ValidationError("Username %s already exists", value) 
    return attrs 
+0

działa na drugi błąd sprawdzania poprawności serializers.ValidationError ("nazwa użytkownika" + wartość + "już istnieje"), ale powyższy błąd sprawdzania poprawności nadal pokazuje "nick": ["pole to jest wymagane."] I powinno brzmieć "nick" : ["Nick nie może być pusty"] – eddwinpaz

+0

@eddwinpaz: Czy jesteś pewien, że pole nick jest puste i nie tylko nieobecne (np. Null)? Czy możesz opublikować odpowiedni kod modelu? – Fiver

+0

edytował pytanie, aby zobaczyć mój kod. – eddwinpaz

2

odpowiedź na to pytanie dodaje również odpowiedział jako @Fiver

class userLoginSerializer(serializers.ModelSerializer): 

    nick = serializers.CharField(error_messages={'required':'Please Type a Username'}) 
    pass_field = serializers.CharField(error_messages={'required':'Please Type a Password'}) 

    class Meta: 
     model = users 
     fields = ('nick', 'pass_field') 
0

Powinna istnieć możliwość zmiany komunikatów o błędach na poziomie modelu, ale niestety REST Framework jeszcze tego nie obsługuje. Here to problem dotyczący tego problemu. Zawiera sugerowaną metodę nadpisywania walidatora w module serializera.

0

Należy użyć niestandardowego programu obsługi błędów. Postępuj zgodnie z here, aby skonfigurować.

Twój błąd obsługi klienta powinno być tak:

def custom_exception_handler(exc, context): 
# Call REST framework's default exception handler first, 
# to get the standard error response. 
response = exception_handler(exc, context) 

# Now add the HTTP status code to the response. 
if response is not None: 
    for field, value in response.data.items(): 
     value = ''.join(value) 
    response.data = {} # Empty django's custom error 
    response.data['detail'] =value #customize it how you want 

return response