2009-03-25 14 views
42

Ich bin mir sicher, dass ich etwas wirklich offensichtlich dummes mache, aber ich versuche es jetzt für ein paar Stunden herauszufinden und nichts springt mir entgegen.Django ImageField funktioniert nicht richtig über ModelForm

Ich verwende ein ModelForm, damit ich ein paar Felder aus einem Modell zur Bearbeitung freigeben kann. 2x ImageField, 1x TextField. Das Formular wird verarbeitet und das TextField funktioniert. Die beiden ImageFields funktionieren nicht und deshalb bin ich heute hier.

Ich verwende Django 1.0.2

Hier ist der relevante Code (fragen Sie, wenn Sie mehr brauchen - und ich bin auch nicht die HTML, weil dieser Teil gut zu funktionieren scheint):

Modell :

class Company(models.Model): 
    #... 
    logo = models.ImageField(upload_to='logos', blank=True) 
    intro_pic = models.ImageField(upload_to='intropics', blank=True) 
    intro_text = models.TextField(blank=True) 

Ansicht und Form:

def admin_edit(request, company_slug): 
    company = get_object_or_404(Company, slug = company_slug) 

    f = AdminEditForm(instance = company) 
    if request.method == 'POST': 
     f = AdminEditForm(request.POST, instance = company) 
     if f.is_valid(): 
      print "Processing form" 
      print f.cleaned_data['intro_pic'] 
      f.save() 

    return render_to_response('uadmin/edit.html', {'company':company, 'f':f}, RequestContext(request)) 


class AdminEditForm(ModelForm): 
    class Meta: 
     model = Company 
     fields = ['logo', 'intro_pic', 'intro_text'] 

Antwort

97

Nun, ich wie ein Idiot fühlen. Damit Django der Lage sein, hochgeladene Dateien zu verarbeiten, müssen Sie das request.FILES Variable in die Form zu übergeben (Sinn macht, nicht wahr ?!)

In meinem Fall die folgende Zeile geht aus:

f = AdminEditForm(request.POST, instance = company) 

an:

f = AdminEditForm(request.POST, request.FILES, instance = company) 

Eine andere Sache zu prüfen, (wenn Sie in so etwas wie dies in der Zukunft laufen) ist, dass das Formular mehrteiliger ist. Ihr <form> Tag sollte in etwa so aussehen:

<form enctype="multipart/form-data" method="post" action=""> 
+0

Vielen Dank! In meinem Fall habe ich den 'enctype =" multipart/form-data "' Teil –

+1

Kerl Idiot hier – Chase

+0

Es ist eine überraschend einfache Sache zu verpassen. Ich habe seitdem gefunden Crispy mit meinen Form-Tags (sowie andere Dinge) helfen hilft. – Oli