8

Questo è il mio Django Riposo quadro codice/vista che viene chiamato quando provo a registrare un utente:AngularJS Django Resto quadro - cercando di replicare oggetto JS sollevata in caso di errore del server 400

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) 

e questo è il mio AngularJS codice che registra un utente/richiama vista Django postato sopra:

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); 
}; 

Quando si tenta di registrare un utente già esistente, questo è ciò che viene registrato:

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]"} 

Sto cercando di replicare l'oggetto perché durante tutta la mia applicazione, quando sollevo errori per i moduli, voglio mantenere la consistenza e generare errori nello stesso modo (dove l'oggetto ha il nome del campo e quindi un array che contiene una stringa messaggio di errore a cui è possibile accedere utilizzando i dati [prop]).

Quindi questo è quello che ho provato sulla JSfiddle: http://jsfiddle.net/snmyvqow/1/

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

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

il problema è, il codice precedente registra questo alla console:

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] 

Si noti che i dati [prop] è diverso anche anche se ho provato a ricreare l'oggetto nella stessa forma. Un'altra differenza che ho notato è che nella mia applicazione, la lunghezza dell'array all'interno della matrice viene registrato, in questo modo:

length: 1 

ma nel mio codice JSfiddle, la lunghezza non viene registrato. L'ultima differenza che ho notato è che nel mio codice JSfiddle, l'array all'interno dell'array viene chiamato Object mentre nella mia applicazione, l'array all'interno dell'array viene chiamato Array [1]. Qualche idea del perché? E come posso ricreare l'oggetto/array in modo che i dati [prop] restituiscano la stringa anziché restituire

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

?

+2

perché serializer.errors restituisce per impostazione predefinita la matrice all'interno dell'oggetto. Significa che restituisce '{username: [" Questo nome utente è già in uso. Per favore, riprova "]}" nel tuo caso. Se si desidera controllare, aprire lo strumento Dev e vedere nella scheda Response –

+1

@HiteshSiddhapura Awesome, thanks. Ho modificato la variabile dei dati in "{username: [" Questo nome utente è già in uso. Per favore, riprova "]}" e ora restituisce lo stesso oggetto di quello che stavo cercando di replicare. Ecco il nuovo JSfiddle per chi è interessato: http://jsfiddle.net/snmyvqow/3/ Puoi metterlo giù come risposta e lo contrassegnerò come risolto. – user2719875

+0

grazie. Felice che funzioni per te. –

risposta

1

Python Django serializer.errors (Read Here) per impostazione predefinita restituisce un modulo all'interno dell'oggetto. Significa che dovrebbe tornare come sotto nel tuo caso.

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

Se si desidera controllare, aprire lo strumento Dev e vedere nella scheda Response.

+0

@ user2719875 Grazie per accettarlo. Mi piace anche HA HA :) –