8

To mój Django Reszta Framework code/widok, który zostanie wywołany, gdy próbuję zarejestrować użytkownika:angularjs Django Reszta Framework - próbuje replikować obiekt JS podniesiona na 400 błędu serwera

def post(self, request): 
    serializer = UserSerializer(data=request.DATA) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response(serializer.data, status=status.HTTP_201_CREATED) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

i to jest moje angularjs kod, który rejestruje użytkownika/wywołuje widok Django zamieszczonych powyżej:

self.add = function() { 
    $http.post("/CMS/users", self.user) // this URL calls the Django view posted above 
    .error(function(data, status, headers, config) { 
     console.log(data); 
     for (prop in data) { 
      console.log(data[prop]); 
     }; 
    }) 
    .then(fetchUsers); // gets a list of existing users 
    console.log("User clicked submit with ", self.user); 
}; 

Gdy próbuję zarejestrować użytkownika, który już istnieje, to jest to, co jest rejestrowane:

Object {username: Array[1]} 
    username: Array[1] 
     0: "This username is already taken. Please, try again" 
     length: 1 
     __proto__: Array[0] 
      concat: concat() { [native code] }constructor: Array() { [native code] }entries: entries() { [native code] }every: every() { [native code] }filter: filter() { [native code] }forEach: forEach() { [native code] }indexOf: indexOf() { [native code] }join: join() { [native code] }keys: keys() { [native code] }lastIndexOf: lastIndexOf() { [native code] }length: 0map: map() { [native code] }pop: pop() { [native code] }push: push() { [native code] }reduce: reduce() { [native code] }reduceRight: reduceRight() { [native code] }reverse: reverse() { [native code] }shift: shift() { [native code] }slice: slice() { [native code] }some: some() { [native code] }sort: sort() { [native code] }splice: splice() { [native code] }toLocaleString: toLocaleString() { [native code] }toString: toString() { [native code] }unshift: unshift() { [native code] }Symbol(Symbol.iterator): ArrayValues() { [native code] }Symbol(Symbol.unscopables): Object __proto__: Object 
    __proto__: Object 

["This username is already taken. Please, try again"] // this is data[prop] 
User clicked submit with Object {username: "a", password: "apass", email: "[email protected]"} 

Próbuję replikować obiekt, ponieważ w całej aplikacji, gdy zgłaszam błędy dla formularzy, chcę zachować spójność i podnosić błędy w ten sam sposób (gdzie obiekt ma nazwę pola, a następnie tablicę zawierającą ciąg znaków komunikat o błędzie, do którego można uzyskać dostęp za pomocą danych [prop]).

Więc to, co starałem się na JSfiddle: http://jsfiddle.net/snmyvqow/1/

var data = {username: {0: "test."}} 

for (prop in data) { 
    console.log(data); 
    console.log(data[prop]); 
} 

Problem jest, powyższy kod rejestruje to w konsoli:

Object {username: Object} 
    username: Object 
     0: "This username is already taken. Please, try again" 
     __proto__: Object 
    __proto__: Object 

Object {0: "This username is already taken. Please, try again"} // this is data[prop] 

Zauważ, że dane [prop] różni się nawet chociaż próbowałem odtworzyć obiekt w tej samej formie. Inną różnicą jest to, że zauważyłem w mojej aplikacji, długość tablicy wewnątrz tablicy pobiera rejestrowane, tak jak poniżej:

length: 1 

ale w moim kodu JSfiddle długość nie jest zalogowany. Ostatnią różnicą, jaką zauważyłem, jest to, że w moim kodzie JSfiddle tablica wewnątrz tablicy jest nazywana Obiektem, podczas gdy w mojej aplikacji tablica wewnątrz tablicy jest określana jako Tablica [1]. Każdy pomysł, dlaczego? I w jaki sposób mogę odtworzyć obiekt/tablicę, aby dane [prop] zwróciły ciąg, a nie wracały, a nie wracały, a nie wracały, a nie wracały.

+2

ponieważ serializer.errors domyślnie zwraca formularz tablicy wewnątrz obiektu. To znaczy, że zwraca '{username: [" Ta nazwa użytkownika jest już zajęta. Proszę, spróbuj ponownie "]}' w twoim przypadku. Jeśli chcesz to sprawdzić, otwórz narzędzie Dev i wejdź do zakładki odpowiedzi –

+1

@HiteshSiddhapura Awesome, thanks. Zmieniono zmienną danych na "{nazwa_użytkownika: [" Ta nazwa użytkownika jest już zajęta. Spróbuj ponownie "]}", a teraz zwraca ten sam obiekt, co próbowałem skopiować. Oto nowy JSfiddle dla zainteresowanych: http://jsfiddle.net/snmyvqow/3/ Możesz podać to jako odpowiedź, a ja oznaczyłem to jako rozwiązane. – user2719875

+0

dzięki. Cieszę się, że to działa dla ciebie. –

Odpowiedz

1

Python Django serializer.errors (Read Here) domyślnie zwraca formularz tablicy wewnątrz obiektu. To znaczy, że powinien powrócić jak poniżej w twoim przypadku.

var data = {username: ["This username is already taken. Please, try again"]} 

Jeśli chcesz sprawdzić, a następnie otwórz narzędzie Dev i przejdź do zakładki odpowiedzi.

+0

@ user2719875 Dzięki temu przyjmij to. Również podoba mu się HA HA :) –