Wie kann man Formularfelder durchlaufen und sie alle in der Datenbank speichern?

Ich versuche, Formularfelder zu durchlaufen und in der Datenbank zu speichern. Das Problem ist, dass es immer nur das letzte Feld ist, das gespeichert wird. Die vorherigen sind "übersprungen". Kann ich die Formulare in Django folgendermaßen bearbeiten?

Models.py:

class Category(models.Model): name = models.CharField(max_length=30, unique=True) user = models.ForeignKey(User, blank=True, null=True) class Meta: verbose_name_plural = "Ingredience Categories" def __unicode__(self): return self.name 

Form.py

 class CategoryForm(ModelForm): class Meta: model = Category fields = ('name',) 

Home.html Vorlage (ich baue mein Formular "manuell", weil ich in der Lage bin, dynamisch weitere Eingabefelder über jQuery hinzuzufügen):

 <h3>Insert New Categories</h3> <form action="/" method="post" id="ingr-cat-form">{% csrf_token %} <p><label for="id_0-name">Name:</label> <input type="text" maxlength="30" name="name" id="id_0-name"></p> <p><label for="id_1-name">Name:</label> <input type="text" maxlength="30" name="name" id="id_1-name"></p> <p><label for="id_2-name">Name:</label> <input type="text" maxlength="30" name="name" id="id_2-name"></p> <input type="submit" name="ingrCatForm" value="Save" /> </form> 

Views.py:

 def home(request): if request.method == 'POST': catform = CategoryForm(request.POST, instance=Category()) # store bounded form to catform catformInstance = catform.save(commit = False) # create instance for further modification, don't commit yet catformNames = request.POST.getlist('name') # get a list of input values whose element name is "name" for name in catformNames: # loop through all name elements catformInstance.name = name # modify form instance; insert current name catformInstance.save() # save the instance to the database return HttpResponseRedirect('') else: catform = CategoryForm(instance=Category()) context = {'catform': catform} return render_to_response('home.html', context, context_instance=RequestContext(request)) 

Test Fall Schritte:

  1. Fügen Sie die folgenden Werte in die 3 Eingabefelder ein: value1, value2, value3
  2. Drücken Sie die Schaltfläche "Senden"

Erwartetes Ergebnis:

  • Alle 3 Werte werden in der Datenbank gespeichert

Tatsächliche Ergebnis:

  • Nur der letzte Wert (value3) wird in der Datenbank gespeichert

One Solution collect form web for “Wie kann man Formularfelder durchlaufen und sie alle in der Datenbank speichern?”

Sie erstellen nur eine Instanz von catformInstance , dann ändern Sie den Wert jedes Mal in der Schleife. Sie aktualisieren eine Zeile in der Datenbank, anstatt eine neue Zeile jedes Mal zu erstellen.

Tu das stattdessen

  for name in request.POST.getlist('name'): catform = CategoryForm({'name': name}, instance=Category()) catform.save() 

Beachten Sie, dass wir in jedem name explizit anstelle des ganzen Satzes von POST Werten übergeben; In diesem Fall wird es nur den Nachnamen aus der Namensliste holen und dann bei der nächsten Iteration fehlschlagen, da der name nicht mehr aus der Anfrage verfügbar ist.

  • Wie man Daten zwischen Django-Ansichten übergibt
  • Dynamisches Feld zu einem Formular hinzufügen
  • Dynamisch bevölkertes Wahlfeld in Django
  • Was sind die Schritte, um eine ModelForm mit einer ManyToMany-Beziehung mit einem Zwischenmodell in Django zu machen?
  • Was bedeutet es mit dem Objekt nicht reversible Django
  • Löschen von Django-Formularfeldern auf Formularvalidierungsfehler?
  • Zeigen Sie einen freien Text zwischen Django Formularfeldern an
  • So überschreiben Sie django 'unique' Fehlermeldung für Benutzername in benutzerdefinierten UserChangeForm
  • Erstellen eines dynamischen Auswahlfeldes
  • Django, speichern ModelForm
  • Django ModelChoiceField - etwas anderes als ID verwenden?
  • Python ist die beste Programmiersprache der Welt.