2012-04-03 16 views
1

Ich entwickle eine Website, und ich integrierte bereits die Funktion den Benutzer sein Passwort ändern lassen. Ich verwende die integrierte Ansicht in django.contrib.auth.Ändern des Passwortes in Django mit AJAX

Jetzt, müssen wir es mit AJAX tun. Ich meine, die Idee ist, die Anfrage an den Server zu senden, ohne die gesamte Seite neu zu laden. Wenn das Passwort richtig geändert wurde, dann muss ich nur eine Nachricht anzeigen, und wenn nicht, das Formular mit den Fehlern der einzelnen Felder.

Ich konnte es eine separate Ansicht zu diesem Zweck erstellen, aber ich frage mich wenn es eine Alternative ist? Ich meine, die Ansicht sollte ziemlich einfach sein, aber ist bereits in django.contrib.auth ...

Antwort

1

Es ist definitiv möglich, vorhandene django.contrib.auth Ansichten Unterklasse, aber ich denke, Ihre eigenen Ajax-spezifische Ansicht ist ein besserer Ansatz und es dauert sowieso nur ein paar Zeilen Code.

Hier ist, was es aussehen kann:

@login_required 
def change_password(request): 

    if request.is_ajax(): 
     try: 
      # extract new_password value from POST/JSON here, then 

      user = User.objects.get(username=request.user.username) 
     except User.DoesNotExist: 
      return HttpResponse("USER_NOT_FOUND") 
     else 
      user.set_password(new_password) 
      user.save() 

     return HttpResponse("OK") 
    else: 
     return HttpResponse(status = 400) 
+0

OP bedeutet Benutzer nur sein/ihr Passwort ändern. GET-Methode sieht hier auch schlecht aus. – okm

+0

@okm Sicher. Ich bezog mich auch auf 'change_password', nicht auf' reset_password'. @BluesRockAddict danke. In der Tat konnte ich den Code einfach kopieren und aus der 'password_change'-Ansicht einfügen und nur die Antworten ändern, aber ich fragte mich, ob es einen Weg gibt, den Code nicht zu kopieren und einzufügen. Besser denken, ich glaube nicht wirklich, dass es '' ( –

+0

ich meine, warum Sie ID hier brauchen, ist nicht request.user genug? Ihr Code erlaubt eingeloggten Benutzer, andere Passwort zu ändern, was schlecht klingt. Auch HTTP-Methoden haben ihre eigene Implikation, GET ist nicht für solche Aufgaben geeignet – okm

1

Wenn ich wählen waren, habe ich auch mit der Implementierung einer separaten Ansicht für Ihre Zwecke gehen würde. Wenn Sie django.contrib.auth in klassenbasierten Ansichten erneut implementieren, können Sie die Logik zum Ändern des Kennworts idealerweise wiederverwenden und Ihren Code nur für den Teil schreiben, der eine Antwort zurückgibt, die für AJAX besser geeignet ist. Aber schade, dass wir nicht den Luxus davon haben, zumindest nicht für Django 1.3 oder vorher.

Aber um Ihre Frage zu beantworten, ja, gibt es eine Alternative (oder Hack würde ich es nennen), mit der Sie die Ansicht in django.contrib.auth wiederverwenden können. Angenommen, Sie verwenden jQuery, beim Senden der Änderung Passwort Formular, würden Sie eine AJAX POST-Anfrage an den Server und erwarten html im Gegenzug (siehe unten). Der zurückgegebene HTML-Code entspricht dem, den Sie erhalten würden, wenn Sie nicht-AJAX-POST verwenden.

var post_url = $form.attr("action"); 
    $.ajax({ 
    type: "POST", 
    url: post_url, 
    data: $form.serialize() 
    }).done(function(html) { 
    // check the html and use that to determine what message to prompt back to your user 
    }); 
Verwandte Themen