Wow, es ist ein Jahr her, seit ich diesen Thread gesehen habe. Nun, mit der Einführung von Django 1.3 und den magischen, undokumentierten klassenbasierten Ansichten ist es einfacher geworden, Djangos sichtbezogene Funktionalität zu erweitern. Mein Projekt, das Djangos Klassen-basierte generische CRUS-Ansichten stark nutzt, benötigt AJAX- und JSON-Funktionalität. Ich habe ein Beispiel hinzugefügt, wie ich Djangos Update-Ansicht geändert habe, um AJAX zu unterstützen und AJAX-Antworten im JSON-Format zurückzugeben. Werfen Sie einen Blick:
def errors_to_json(errors):
"""
Convert a Form error list to JSON::
"""
return dict(
(k, map(unicode, v))
for (k,v) in errors.iteritems()
)
class HybridUpdateView(UpdateView):
"""
Custom update generic view that speaks JSON
"""
def form_valid(self, form, *args, **kwargs):
"""
The Form is valid
"""
form.save()
self.message = _("Validation passed. Form Saved.")
self.data = None
self.success = True
payload = {'success': self.success, 'message': self.message, 'data':self.data}
if self.request.is_ajax():
return HttpResponse(json.dumps(payload),
content_type='application/json',
)
else:
return super(HybridUpdateView, self).form_valid(
form, *args, **kwargs
)
def form_invalid(self, form, *args, **kwargs):
"""
The Form is invalid
"""
#form.save()
self.message = _("Validation failed.")
self.data = errors_to_json(form.errors)
self.success = False
payload = {'success': self.success, 'message': self.message, 'data':self.data}
if self.request.is_ajax():
return HttpResponse(json.dumps(payload),
content_type='application/json',
)
else:
return super(HybridUpdateView, self).form_invalid(
form, *args, **kwargs
)
Die Antwort JSON enthält drei Felder - message
(die eine vom Menschen lesbare Nachricht ist), data
(die diesen Fall wäre die Liste der Formfehler) und success
(die entweder true
oder false
, ob die Anfrage erfolgreich war oder nicht.). Dies ist in jQuery clientseitig sehr einfach zu handhaben. Eine Probe Antwort wie folgt aussieht:
Content-Type: application/json
{"message": "Validation failed.", "data": {"host": ["This field is required."]}, "success": false}
Dies ist nur ein Beispiel dafür, wie ich die Formfehler zu JSON serialisiert und implementiert es in einer klassenbasierten allgemeinen Ansicht kann aber ausgeschlachtet werden, auch mit regelmäßiger Stil Ansichten zu arbeiten.
Hallo Calvin, Was ist ein Fehler und was ist ein Erfolg? Gibt es einen Wert, den ich zurückgeben sollte? Wie kann ich auf der Serverseite eine Liste von Validierungsfehlern als JSON zurückgeben, sodass ich sie auf der Clientseite mithilfe der Fehlerfunktion auflisten kann? Das ist das Bit, das mich verwirrt. Danke. –
Erfolg ist, wenn das, was Sie senden, sendet der Service Daten zurück. Bei Erfolg werden Sie die Daten bearbeiten und etwas damit tun (in der Regel ein Feld aktualisieren oder eine Nachricht anzeigen). Fehler ist, wenn der Dienst einen schwerwiegenden Fehler zurückgibt (der Dienst ist defekt oder etwas ist beschädigt). Normalerweise würden Sie false zurückgeben und nichts tun, aber wenn der Dienst für Ihre Sache erforderlich ist, würden Sie dem Benutzer sagen, dass der Dienst ausgefallen ist. Die JSON-Seite der Dinge wird von Ihrem Back-End-Service behandelt. Leider sind meine Back-End-Fähigkeiten nicht ganz da, also kann ich dir nicht sagen, wie man den Service schreibt. – Calvin