2009-02-03 1 views
10

Ich habe versucht help(django.db.models.ImageField) und dir(django.db.models.ImageField), auf der Suche nach, wie Sie ein ImageField Objekt aus einem Bild erstellen, das hochgeladen wird.Django - Wie wird aus InMemoryUploadedFile eine FieldFile eines ImageFields?

request.FILES hat die Bilder als InMemoryUploadedFile, aber ich versuche, ein Modell zu speichern, die ein ImageField enthält, so wie schalte ich die InMemoryUploadedFile in die ImageField?

Wie gehst du dazu, diese Art von Sache zu finden? Ich vermute, dass die beiden Klassen eine Vererbungsbeziehung haben, aber ich müsste viel tun, um herauszufinden, ob ich schauen sollte.

Antwort

3

Sie versuchen, es in ModelForm zu tun? Diese

ist, wie ich für Dateifeld tat

class UploadSongForm(forms.ModelForm): 
    class Meta: 
     model = Mp3File 

    def save(self): 
     content_type = self.cleaned_data['file'].content_type 
     filename = gen_md5() + ".mp3" 
     self.cleaned_data['file'] = SimpleUploadedFile(filename, self.cleaned_data['file'].read(), content_type) 
     return super(UploadSongForm, self).save() 

Sie können es als Beispiel nehmen und in Quelle, welche InMemoryUploadedFile Klasse Bedürfnisse in Initialisierungsparameter suchen.

+0

Danke, werde ich einen Blick in Ihr Beispiel näher morgen. Ich übergehe den Formularprozess, da ich versuche, Benutzer vom Hochladen von Bildern zu befreien, sodass die Datei "cleaned_data" nicht ausgeführt werden kann. –

1

Sie ein Formular unter Verwendung von Formularinstanzen mit einem Datei-Upload-Feld implementieren könnte, hier ist die Ansicht:

def form_view(request): 
    if request.method == 'POST': 
     form = FooForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return render_to_response('result.html') 
     return render_to_response('form.html', { 
      'form': form; 
      'error_messages': form.errors; 
     } 
    form = FooForm() 
    return render_to_response('form.html', { 
     'form': form; 
    } 

form.save() speichert die hochgeladene Datei zusammen mit allen anderen Bereichen, wie Sie enthalten request.FILES Argument in seinem Konstruktor. In Ihrer Modelle haben Sie FooForm Unterklasse von Modelform Klasse wie folgt zu definieren:

class FooForm(ModleForm): 
    Meta: 
     model = Foo 

... wo Foo ist die Unterklasse von Modell, dass die Daten, die Sie beschreibt speichern möchten beharrlich.

16

Sie müssen die InMemoryUploadedFile zum ImageField anstatt ‚drehen‘ in ein ImageField speichern:

image = request.FILES['img'] 
foo.imagefield.save(image.name, image) 

wo foo ist die Modellinstanz und Imagefield die ImageField ist.

Alternativ, wenn Sie das Bild aus einer Form ziehen:

image = form.cleaned_data.get('img') 
foo.imagefield.save(image.name, image) 
+0

Diese Antwort ist nicht korrekt. Sie können den Dateiinhalt wie gewünscht verwenden, ohne ihn in einer Modellinstanz zu speichern. Überprüfen Sie das Dateiattribut – Imnl

Verwandte Themen