2009-08-22 9 views
4

Mein Problem ist einfach. Ich habe Vorlage wie folgt aus:Viele Dateien in ImageField-Formular hochladen - Django

<form enctype="multipart/form-data" 
action="{% url offers.views.add_offer %}" method="post">  
    <input type="file" name="image1" /> 
    <input type="file" name="image2" />  
    <input type="submit" value="Add" /> 
</form> 

Modell sieht so aus:

class Image(models.Model): 
    image = models.ImageField(upload_to='uploads/images/offers/') 

und bildet so (es verwendet Modell Bild):

class ImageForm(ModelForm): 
    class Meta: 
     model = Image 

Und sehen wie folgt aus:

for f in request.FILES: 
    # imageform: 
     image = ImageForm(request.POST, f) 
     image.save() 

Das Problem ist, dass ich nicht hochladen kann Bilder. Ich möchte das Bild in den zwei separaten Instanzen von Image Model speichern.
Ich habe einen Fehler:

'unicode' object has no attribute 'get'

Vielen Dank für jede Hilfe und Antwort.

Informationen mehr liefern

Aktualisiert

Antwort

8

Man, Django Formsets ist, was Sie brauchen:

http://docs.djangoproject.com/en/dev/topics/forms/formsets/

Editiert:

Aussicht:

def manage_images(request): 
    ImageFormSet = formset_factory(ImageForm) 
    if request.method == 'POST': 
     formset = ImageFormSet(request.POST, request.FILES) 
     if formset.is_valid(): 
      # do something with the formset.cleaned_data 
    else: 
     formset = ImageFormSet() 
    return render_to_response('manage_images.html', {'formset': formset}) 

Die Vorlage:

<form enctype="multipart/form-data" action="{% url offers.views.add_offer %}" method="post"> 
    {{ formset.management_form }} 
    <table> 
     {% for form in formset.forms %} 
     {{ form }} 
     {% endfor %} 
    </table> 
</form> 
+0

Aber wie muss ich es benutzen? Mein Problem ist, Daten von der Anfrage zu bekommen. FILES, die ich dachte. Können Sie mir ein Beispiel geben, wie Sie viele Dateien in vielen Instanzen mit Formsets in ein und demselben Modell speichern können? – galuszkak

+1

Ich habe meine Antwort bearbeitet, um Ihnen zu zeigen, wie – nabucosound

1

Was denken Sie macht das funktionieren würde? Sie durchlaufen request.FILES und versuchen, bei jeder Iteration, die ein Dateiobjekt übergibt, ein Formular zu instanziieren. Das ist nichts, was ist in der Dokumentation, die Ihnen sagt, in ganz request.FILES passieren.

Edited nach Kommentar Schauen Sie, Sie haben uns nicht gegeben viel Information zu gehen. Hat Ihr Modell ein oder zwei Bilder? Warum versuchen Sie, die zwei Bilder getrennt zu behandeln? Versuchen Sie, zwei separate Modellinstanzen oder eine mit zwei Bildern zu erstellen? Was genau versuchst du zu tun?

Im Grunde wollen Sie gerade, dies zu tun:

form = ImageForm(request.POST, request.FILES) 
if form.is_valid(): 
    form.save() 

und das ist es.

+0

Also, was ich tun muss? Sie haben eine Lösung dafür? – galuszkak

+0

Modell sieht so aus: Klasse Bild (Modelle.Modell): image = models.ImageField (Upload_to = 'Uploads/Bilder/Angebote /') Es hat nur ein ImageField. Ich möchte zwei separate Instanzen desselben Modells erstellen. Ich weiß, wie man eine Datei/ein Bild speichert. Es ist einfach, wie Sie oben beschreiben. Das ist kein Problem für mich. Mein Problem ist, dass ich nicht weiß, wie diese zwei Instanzen erstellt werden (Dateien von request.FILES abrufen und dann in zwei getrennten neuen Instanzen speichern). Wenn Sie mehr Informationen möchten, kann ich es posten. Ich möchte es im selben Modell speichern. – galuszkak

+0

Ich habe die Frage für die von Ihnen angeforderten Informationen aktualisiert. – galuszkak

2

Hier finden Sie die Dokumentation für file upload.

ich mein Bild in den Speichern des Formulars speichern() - Methode wie folgt:

def save(self): 
    if self.cleaned_data.get('galleryname'): 
     if self.cleaned_data.get('images1'): 

      path = 'images/'+ urlify(self.cleaned_data.get('galleryname'))+self.cleaned_data.get('images1').name 
      destination = open(s.MEDIA_ROOT+path, 'wb+') 
      for chunk in self.cleaned_data.get('images1').chunks(): 
       destination.write(chunk) 
      p = Photo() 
      p.picture="./"+path 
      p.save() 

und in der Ansicht Ich habe

form = CompleteSubscriptionForm(request.POST, request.FILES, error_class=DivErrorList) 
if form.is_valid(): # All validation rules pass 
     form.save()