2016-05-26 9 views
0

Ich bin sehr früh in meiner Django/Python Entwicklung Reise, die meisten Dinge, die ich in der Lage, langsam nach ein paar Stunden/Tage Kopf kratzen und Versuch/Irrtum herauszufinden. Ich habe jetzt die häufig gestellte Frage, dass ich nicht richtig funktionieren kann:Django Benutzer Update Formular und Ansicht

Wie erstelle ich ein Benutzerprofil Update View/Form?

Ich habe auf mehrere Lösungen von Stack Overflow gehackt, und kann einfach nicht herausfinden, was ich bisher falsch mache. Hier ist die erste Version meines schlechten Versuchs mit Django 1.9:

#forms.py 
class profileForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ['first_name', 'last_name', 'email'] 

#views.py 
@login_required 
def profile(request): 
    if request.method == 'POST': 
     form = profileForm(data=request.POST, instance=request.user) 
     update = form.save(commit=False) 
     update.user = request.user 
     update.save() 
    else: 
     form = profileForm(instance=request.user) 

    return render(request, 'profile.html', {'form': form}) 

#urls.py 
urlpatterns = [ 
    url(r'^dashboard/$', views.dashboard, name='dashboard'), 
    url(r'^dashboard/profile$', views.profile, name='profile'), 
] 

#profile.html 
<form action="." method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit">Update Profile</button> 
</form> 

So das aktuelle Verhalten meiner Update Benutzerprofil Ansicht ist nicht auf POST eine der angegebenen Felder im Formular zu aktualisieren, aber die Seite tut Last zu einer anderen URL. Die URL für das Formular zur Profilaktualisierung lautet beispielsweise /dashboard/profile, das bei der Formularübergabe an /dashboard umleitet. Wenn ich E-Mail/Vorname/Nachname im Django-Admin manuell hinzufüge, wird es korrekt in meinem Formular angezeigt ... Ich kann es einfach nicht erhalten, um aktualisierte Daten zu speichern.

Ich hatte eine Version des obigen Codes, der mir auch Benutzernamenfehler gab, von denen ich vermutete, dass sie in der Nähe einer Lösung waren? Schließlich möchte ich die E-Mail-Adresse als den Benutzernamen verwenden, aber ich möchte das herausfinden, sobald ich ein ultra-einfaches Arbeitsprofil-Update-Formular habe.

Ich entschuldige mich im Voraus für die dumme Frage, ich habe gegoogled herum und versuchte andere Lösungen, aber ich kann entweder nicht die gleichen anfänglichen Fehler bekommen oder kann nicht eine funktionierende Version wie detailliert erhalten.

Vielen Dank und einen schönen Tag/Nacht!

EDIT:

ich auch diese Lösung How to update User object without creating new one? versucht haben, die auch das gleiche Verhalten hat: keine der angegebenen Felder im Formular auf POST aktualisieren, aber die Seite tut Last auf eine andere URL. .. was verwirrt mich mehr, vielleicht ist das Problem mit meinem urls.py stattdessen?

Antwort

2

Hier gibt es nichts speziell für die Benutzer. Sie haben zwei Probleme: Das erste ist wegen Ihrer URLs. Ihre Profilansicht endet nicht mit einem Schrägstrich, daher wird die Aktion "." sendet es an den übergeordneten "/ dashboard", und es geht überhaupt nicht durch den Verarbeitungscode.

url(r'/dashboard/profile/$'...) 

Zweitens wird das Modell nicht aktualisiert, weil Sie die Valdation-Methode des Formulars nicht aufgerufen haben.

if request.method == 'POST': 
    form = profileForm(data=request.POST, instance=request.user) 
    if form.is_valid(): 
     form.save() 
     return redirect('somewhere') 

Hinweis es gibt keinen Grund, das Commit = False-Zeug hier zu verwenden; Die Instanz ist bereits der Benutzer.

+0

Danke für die Erklärung Daniel, sehr geschätzt - urls.py sollte der erste Ort gewesen sein, den ich mit dem seltsamen Submission-Verhalten überprüft habe. Ihr Beispiel scheint zu fehlen der Doppelpunkt 'if form.is_valid():' Danke noch einmal. – tract

+0

Guter Ort, behoben. –

Verwandte Themen