2016-12-19 3 views
0

Wie würde ich eine Ansicht mit einem einzigen Formular schreiben, um eine neue Person hinzuzufügen, und auf dem gleichen Formular können 0 oder 1 oder 2 oder ... 68757857 Bilder davon hinzufügen Person?Django: zwei Formen in einer Ansicht

Bitte beachten Sie den folgenden Code.

In models.py:

class Person(models.Model): 
    name = models.CharField(max_length=50) 

class Image(models.Model): 
    person = models.ForeignKey(Person) 
    image = models.ImageField(upload_to='images/') 

In forms.py:

class PersonForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ['name'] 

class ImageForm(forms.ModelForm): 
    class Meta: 
     model = Image 
     fields = ['person', 'image'] 

Von dem, was ich gesehen habe, Formularsätze verwendet werden. Ich habe viele Beispiele auf SO angeschaut, lese die Dokumentation und bin immer noch verwirrt.

Ich würde es schätzen, wenn jemand ein Beispiel für ein seview.py liefern kann, das die Spezifikation am Anfang dieser Frage erfüllt.

Antwort

1

Sie könnten Inline formsets verwenden.

In view.py firt einmal müssen Sie eine neue Person-Instanz erstellen und dann diese Instanz mit formset verwenden:

from django.forms import inlineformset_factory 
ImageFormSet = inlineformset_factory(Person, Image, fields=('image',)) 

def my_view(request): 
    form = PersonForm(request.POST or None) 
    if form.is_valid(): 
     new_person = form.save() 
     formset = ImageFormSet(request.POST or None, request.FILES or None, instance=new_person) 
     if formset.is_valid(): 
      formset.save() 
      return redirect('persons:main') 
    else: 
     formset = ImageFormSet(request.POST or None, request.FILES or None) 
    return render(request, 'my_template.html', {'formset': formset, 'form': form}) 

In my_template.html:

<form action="" method="post" enctype="multipart/form-data"> 
     {{ form.as_p }} 
     {{ formset.management_form }} 
     {% for frm in formset %} 
      {{ frm.as_p }} 
     {% endfor %} 
     <input type="submit" value="Create"> 
</form> 
+0

In Ihrem Code, wenn die PersonForm nicht ist gültig, die Ansicht wird kein HttpResponse-Objekt zurückgeben. Es wird stattdessen None zurückgegeben. Wie gehe ich mit diesem Fall um? – Flux

+0

@Flux oops, tut mir leid, es ist nur ein Fehler mit dem Einzug. Überprüfen Sie die aktualisierte Antwort. – neverwalkaloner

+0

Wenn form.is_valid() false zurückgibt, wird das variable Formset möglicherweise nicht definiert, wenn Sie versuchen, die Vorlage zu rendern. – Flux