47 votes

Django Imagefield ne fonctionne pas correctement via ModelForm

Je suis certain que je suis en train de faire quelque chose de vraiment bien évidemment stupide, mais j'ai essayé de le comprendre, pour quelques heures maintenant et rien ne saute aux yeux.

Je suis à l'aide d'un ModelForm donc je peux exposer quelques domaines à partir d'un modèle pour l'édition. 2x ImageField, 1x TextField. La Forme est traitée et le TextField œuvres. Les deux ImageFields ne fonctionnent pas et voilà pourquoi je suis ici aujourd'hui.

Je suis l'aide de Django 1.0.2

Voici le code (demandez si vous avez besoin de plus -- et je ne suis pas y compris le HTML parce que la partie semble bien fonctionner):

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)

La vue et de la 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']

107voto

Oli Points 65050

Eh bien, je me sens comme un idiot. Pour que Django puisse traiter les fichiers téléchargés, vous devez transmettre la variable request.FILES au formulaire (cela a du sens, non?!)

Dans mon cas, la ligne suivante va de:

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

À:

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

Une autre chose à vérifier (si vous rencontrez quelque chose comme cela à l'avenir) est que votre formulaire est en plusieurs parties. Votre balise <form> devrait ressembler à ceci:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X