2009-03-25 7 views
42

Je suis certain que je fais quelque chose de vraiment manifestement stupide, mais j'ai essayé de le comprendre depuis quelques heures maintenant et rien ne me saute aux yeux. J'utilise un ModelForm pour exposer quelques champs d'un modèle à éditer. 2x ImageField, 1x TextField. Le formulaire est traité et le TextField fonctionne. Les deux ImageFields ne fonctionnent pas et c'est pourquoi je suis ici aujourd'hui.Django Imagefield ne fonctionne pas correctement via ModelForm

J'utilise Django 1.0.2

Voici le code approprié (demandez si vous avez besoin de plus - et je ne suis pas compris le code HTML parce que cette partie semble fonctionner très bien):

Modèle :

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) 

Voir et forme:

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'] 

Répondre

97

Eh bien, je me sens comme un idiot. Pour Django pour pouvoir traiter les fichiers téléchargés, vous devez passer la variable request.FILES à la forme (logique, non ?!)

Dans mon cas, la ligne suivante va de:

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

pour:

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

Une autre chose à vérifier (si vous avez quelque chose comme ça à l'avenir) est que votre formulaire est multipart. Votre balise <form> devrait ressembler à ceci:

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

Merci! Dans mon cas, il me manquait le 'enctype =" multipart/form-data "' partie –

+1

idiot compagnon ici – Chase

+0

C'est une chose étonnamment facile à manquer. J'ai depuis trouvé que laisser Crispy gérer mes étiquettes de forme (ainsi que d'autres choses) aide. – Oli

Questions connexes