Seite 1 von 1

mithilfe model.forms Daten ändern

Verfasst: Donnerstag 29. Dezember 2022, 18:18
von Pitwheazle
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 %}

Re: mithilfe model.forms Daten ändern

Verfasst: Donnerstag 29. Dezember 2022, 22:44
von paddie
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)

Re: mithilfe model.forms Daten ändern

Verfasst: Freitag 30. Dezember 2022, 08:15
von Whitie
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

Re: mithilfe model.forms Daten ändern

Verfasst: Freitag 30. Dezember 2022, 14:56
von Pitwheazle
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>

Re: mithilfe model.forms Daten ändern

Verfasst: Freitag 30. Dezember 2022, 15:42
von Sirius3
Du hast da ein <form>-Tag zu viel. Und die <table>-Tags sind an der falschen Stelle.

Re: mithilfe model.forms Daten ändern

Verfasst: Freitag 30. Dezember 2022, 15:54
von Pitwheazle
Oh Mann - ich bin zu schlampig! Danke, jetzt klappt es.