mithilfe model.forms Daten ändern

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 871
Registriert: Sonntag 19. September 2021, 09:40

Ich habe ein Template erstellt, auf dem Lehrer ihre Daten ändern können - das geht aber noch nicht, irgendwo habe ich wieder einen Denkfehler. Die daten werden angezeigt, wenn man aber auf ändern klickt, wird der vorherige Wert wieder eingetragen.
Wenn ich das richtig sehe, wird
if profil_form.is_valid():
nicht erreicht, jedenfalls nicht, wenn nur ein Wert geändert wird.

view:

Code: Alles auswählen

def profil_lehrer(req):
    lehrer = Profil.objects.get(user=req.user)
    if req.method == 'POST':        
        profil_form = Lehrer_Aendern_Form(req.POST)
        if  profil_form.is_valid():
            profil_form.save()
            return redirect('index')
    else:
        profil_form = Lehrer_Aendern_Form(instance=lehrer,)
    context = {'profil_form': profil_form, 'titel': "Profil"}
    return render(req, 'profil/profil_lehrer.html', context)
form:

Code: Alles auswählen

class Lehrer_Aendern_Form(forms.ModelForm):
    class Meta:
        model = Profil
        fields = ['vorname', 'nachname', 'ort', 'schule', 'jg', 'kurs', 'stufe']
template:

Code: Alles auswählen

{% extends 'auswahl.html' %}   
{% block content %}

<body>
  <p>{{lehrer}}</p>
  <form>
    <table>
      <form action="/profil_lehrer/" method="POST">
      {% csrf_token %}
      {{profil_form.as_table}}
    </table>
    <button type="submit">ändern</button>    
  </form>
</body>
{% endblock %}
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

Schuss ins Blaue: Das Form ist nicht valid. Zum schnellen Testen vielleicht einfach mal ein

Code: Alles auswählen

        if  profil_form.is_valid():
            profil_form.save()
            return redirect('index')
        else:
            print(form.errors)
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Du musst dem Form nach dem Ändern auch die Instanz übergeben. Wie soll es sonst wissen, welcher Lehrer geändert werden soll.

Code: Alles auswählen

if req.method == 'POST':        
        profil_form = Lehrer_Aendern_Form(req.POST, instance=lehrer)
Viele Grüße
Whitie
Pitwheazle
User
Beiträge: 871
Registriert: Sonntag 19. September 2021, 09:40

Danke, sieht logisch aus! Da muss aber noch irgendwo ein Fehler sein und ich habe wahrscheinlich wieder Tomaten auf den Augen.
Klick auf "ändern" schickt einen "GET" request!
Ich lasse jetzt nur vorname und nachname anzeigen und ändere "Herr" bei vorname zu "Frau" und bekomme:

Code: Alles auswählen

1
<WSGIRequest: GET '/profil_lehrer/?csrfmiddlewaretoken=...&vorname=Frau&nachname=Musterlehrer'>
5
[30/Dec/2022 14:47:26] "GET /profil_lehrer/?csrfmiddlewaretoken=...&vorname=Frau&nachname=Musterlehrer HTTP/1.1" 200 1271
... wenn ich den view-Code ändere in:

Code: Alles auswählen

def profil_lehrer(req):
    print("1")
    lehrer = Profil.objects.get(user=req.user)
    print(req)
    if req.method == 'POST': 
        print("2")
        profil_form = Lehrer_Aendern_Form(req.POST, instance=lehrer)
        if  profil_form.is_valid():
            print("3")
            profil_form.save()
            return redirect('index')
        else:
            print("4")
    else:
        print("5")
        profil_form = Lehrer_Aendern_Form(instance=lehrer,)
    context = {'profil_form': profil_form, 'titel': "Profil"}
    return render(req, 'profil/profil_lehrer.html', context)
und das template lautet weiterhin:

Code: Alles auswählen

<body>
  <form>
    <table>
      <form action="/profil_lehrer/" method="POST">
      {% csrf_token %}
      {{profil_form.as_table}}
    </table>
    <button type="submit">ändern</button>    
  </form>
</body>
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast da ein <form>-Tag zu viel. Und die <table>-Tags sind an der falschen Stelle.
Pitwheazle
User
Beiträge: 871
Registriert: Sonntag 19. September 2021, 09:40

Oh Mann - ich bin zu schlampig! Danke, jetzt klappt es.
Antworten