Django - Model aus Form erzeugen

Django, Flask, Bottle, WSGI, CGI…
Antworten
FuzzyLogic
User
Beiträge: 7
Registriert: Freitag 21. August 2015, 08:12

Hallo Zusammen,

ich möchte in einem Django Projekt ein Model aus Benutzereingaben erzeugen können. Dazu habe ich folgenden Code erstellt:

Im Template:

Code: Alles auswählen

<tr>
    <td></td>
    <td><form>{{ form.name }}</form></td>
    <td><form>{{ form.ip }}</form></td>
    <td><form>{{ form.intervall }}</form></td>
    <td><form>{{ form.pfad }}</form></td>
    <td><button type="submit" id="submit_button" class="btn btn-primary btn-sm" value="Submit">Hinzufügen</button></td>
</tr>
Das Model & die Form:

Code: Alles auswählen

class config(models.Model):
    name = models.CharField(max_length=50, unique=True)
    ip = models.GenericIPAddressField()
    intervall = models.IntegerField()
    pfad = models.CharField(max_length=500, unique=True)

    def __str__(self):
        return self.title

    class Admin:
        list_display = ('title', 'ip')
        list_filter = ('title')
        search_fields = ('title', 'ip')

class configForm(ModelForm):
    class Meta:
        model = config
        fields = ['name', 'ip', 'intervall', 'pfad']
Und meine View:

Code: Alles auswählen

def configuration(request):
    getSettings.start()
    template = "config.html"

    if request.method == 'POST':
        form = configForm(request.POST)
        form.save()
    else:
        form = configForm()
    return render(request, template, {
        'configuration': config.objects.all(),
        'form': form,
    })
Wenn Benutzer die Felder ausfüllen und Submit klicken passiert nichts, das Submit funktioniert also nicht.
Wenn man die Felder befüllt und mit Enter bestätigt, läd es die Seite erneut, es wird aber kein neuer Datenbankinhalt erzeugt.

Ich komme hier einfach nicht weiter und wäre über eine Hilfestellung sehr erfreut.

Grüße!
Zuletzt geändert von Anonymous am Mittwoch 13. Januar 2016, 10:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Du hast vergessen zu validieren...

Schau mochmal in die Doku.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@FuzzyLogic: Anmerkungen: Das <form>-Tag wird falsch verwendet. Das muss einmal um das gesamte Formular gesetzt werden (es sei denn man gibt dem <form> eine ID und bei den Formular-Elementen dann diese ID als `form`-Attribut (HTML5)).

Die Namensschreibweisen entsprechen teilweise nicht Style Guide for Python Code, was insbesondere bei den Klassen unangenehm auffällt.
FuzzyLogic
User
Beiträge: 7
Registriert: Freitag 21. August 2015, 08:12

Vielen Dank für die Hilfe. Der erste Schritt hat nun schoneinmal geklappt :)

Allerdings wird nun ein Datenbankeintrag erstellt sobald ich auf Hinzufügen Klicke. Sobald ich die Seite aber neu lade wird der neu Erstellte eintrag wieder gelöscht.
Könntet ihr mich bei dem Problem auch in die richtige Richtung weisen?

Ich habe meine views.py folgendermaßen umgestaltet:

Code: Alles auswählen

def configuration(request):
    getSettings.start()
    template = "config.html"
    if request.method == 'POST':
        form = configForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = configForm()
    return render(request, template, {
        'configuration': config.objects.all(),
        'form': form,
    })
Und das Template schaut jetzt so aus:

Code: Alles auswählen

                 <form method="post" >
                  <td>{{ form.name }}</td>
                  <td>{{ form.ip }}</td>
                  <td>{{ form.intervall }}</td>
                  <td>{{ form.pfad }}</td>
                  <td><button input type="submit" id="submit_button" class="btn btn-primary btn-sm" value="Submit">Hinzufügen</button></td>
                     {% csrf_token %}
                 </form>
BlackJack

@FuzzyLogic: Ist zum Zeitpunkt des `save()`-Aufrufs aus irgendwelchen Gründen eine Datenbanktransaktion aktiv oder hast Du an den „auto commit“-Einstellungen etwas geändert?
FuzzyLogic
User
Beiträge: 7
Registriert: Freitag 21. August 2015, 08:12

@BlackJack: Ich hatte ein script, welches eine Konfiguration aus einer Textdatei ausgelsesn hat. Davor habe ich aber ersteinmal die Datenbanktabelle komplett geleert. Weil der Neu hinzugefügte Eintrag nicht im Textdokument war wurde dies auch nicht wieder eingefügt.

Vielen Dank für die Hilfe allerseits!
FuzzyLogic
User
Beiträge: 7
Registriert: Freitag 21. August 2015, 08:12

Ich möchte hierfür kein neues Thema eröffnen, da es an das Gestrige anlehnt:

Ich kann nun Models aus forms erzeugen. Jetzt will ich aber, dass meine Benutzer in der Lage sind die vorhandenen Models bzw. die Objekt an sich zu verändern.

Code: Alles auswählen

    {% for service in configuration %}
             <tr>
              <form method = "post">
                  <td>{{ forloop.counter}}</td>
                  <td><input type="text" class="form-control"  value="{{ service.name}}"></td>
                  <td><input type="text" class="form-control"  value="{{ service.ip }}"></td>
                  <td><input type="text" class="form-control"  value="{{ service.intervall }}"></td>
                  <td><input type="text" class="form-control"  value="{{ service.pfad }}" ></td>
                  <td><button input type="submit" class="btn btn-primary btn-sm" value="Submit" href="/update">Ändern</button></td>
                  <td><button type="button" class="btn btn-danger">X</button></td>
              {% csrf_token %}
              </form>
              {% endfor %}
Ich habe meine Ausgabe in Eingabefelder umgewandelt und den Startwert auf den Ausgabewert des jeweiligen Models gesetzt. In meiner View.py sieht es folgendermaßen aus:

Code: Alles auswählen

def configuration(request):
    #getSettings.start()
    template = "config.html"

    if request.method == 'POST':
        form = configForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = configForm()
    return render(request, template, {
        'configuration': config.objects.all(),
        'form': form,
    })
Zum Anlegen von neuen Modellen funktioniert es wie gesagt Super, aber bestehende Modelle zu verändern funktioniert nicht.
In meiner View.py verwende ich ja nur Forms und nicht Models und ich vermute dass das Problem daher stammt, weiß aber nicht so recht wie ich das am kleversten anstelle.

Ich habe mal ein wenig rumgespielt und mir überlegt, dass mein "Ändern" Button auf eine weitere Seite verlinken könnte, damit ich in einen anderen View rein komme, der mein Request entsprechend bearbeitet. Dazu habe ich folgende Funktion geschrieben:

Code: Alles auswählen

def config_update(request):
    template = "config.html"
    form = configForm()
    if request.method == 'POST':
        model = config(request.POST)
        name = model.name
        ip = model.ip
        intervall = model.intervall
        pfad = model.pfad
        model.save(name, ip, intervall, pfad)
    return render(request, template, {
        'configuration': config.objects.all(),
        'form': form,
    })
Ich bin ein wenig Ratlos wie ich das anstellen soll. Jeder Hinweis der mcih in die richtige Richtung weist wird geren angenommen :)
Zuletzt geändert von Anonymous am Donnerstag 14. Januar 2016, 15:59, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@FuzzyLogic: Das Problem bei Deinen <form>s ist ja das die alle gleich sind bis auf die Daten. Da fehlt die Information *welches* Modell-Exemplar in einem <form> steckt. Da könnte man beispielsweise ein verstecktes Eingabefeld verwenden welches die ID des Modell-Exemplars enthält.
Antworten