Ausgabe
Neu bei Ajax, also versuche ich, mich mit den Dingen zu beschäftigen. Ich versuche, einen Ajax-Aufruf zu tätigen, indem ich meinen Javascript-Ereignishandler mit dem Onclick für ein Span-Element verbinde. Es gibt kein Formularelement in meiner Vorlage. Ist es möglich, einen Ajax-Aufruf ohne ein Formularelement in Django zu tätigen? So wie ich es verstehe, bekomme ich es aber nicht zum Laufen. Wenn ich mir die Anfrage in meiner Ansicht anschaue, gibt es keinen HTTP_X_REQUESTED_WITH-Header, sodass der Aufruf von request.is_ajax() immer falsch zurückgibt.
Hier ist der relevante Teil meiner Vorlage:
<td><span class="header" onclick="sort_user_table('username')"><a href="">Username</a></span></td>
Hier ist meine Javascript-Funktion:
function sort_user_table(col_name) {
$.ajax({
url: "/listusers/",
data: {sort_order: col_name},
headers: {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'},
type: "GET",
dataType : "json",
success: function(json) {
alert('json = ' + json);
},
});
}
Und hier meine Ansicht:
def list_users_page(request):
if request.is_ajax():
sort_order = request.GET['sort_order']
users = User.objects.all().order_by(sort_order)
data = serializers.serialize('json', users)
json_users = json.dumps(data)
return HttpResponse(json_users, mimetype='application/json')
else:
users = User.objects.all().order_by('last_name')
variables = RequestContext(request, {
'users': users,
})
return render_to_response('users_page.html', variables)
Lösung
Okay, also habe ich herausgefunden, was passiert ist. Ich habe einen Fehler beim Posten meines Vorlagencodes gemacht, sodass er nicht vollständig war (ich habe versucht, mich kurz zu fassen, aber am Ende habe ich eine wichtige Information ausgelassen). So sieht das echte Stück Code aus:
<td><span class="header" onclick="sort_user_table('username')"><a href="">Username</a></span></td>
Das href
hat das Problem verursacht. Da es sich eigentlich um einen Link handelt, wurde eine Anfrage an eine neue Ressource gestellt, als ich auf das Benutzername- span
Element geklickt habe. Obwohl also der Javascript-Code ausgeführt wurde, war es eigentlich keine Ajax-Anfrage, sondern eine einfache HTTP-Anfrage. Wenn ich das einfach href
aus dem span
Element entferne, funktioniert alles wie erwartet. Der HTTP_X_REQUESTED_WITH
Header wird gesendet und meine Django-Ansicht antwortet true auf request.is_ajax()
.
Beantwortet von – nucklehedd
Antwort geprüft von – Cary Denson (FixError Admin)