Django Imagefield не работает должным образом через ModelForm - PullRequest
43 голосов
/ 25 марта 2009

Я уверен, что делаю что-то действительно явно глупое, но я пытаюсь понять это уже несколько часов, и ничто не прыгает на меня.

Я использую ModelForm, чтобы я мог предоставить несколько полей из модели для редактирования. 2x ImageField, 1x TextField. Форма обрабатывается и TextField работает. Два поля ImageField не работают, и именно поэтому я здесь сегодня.

Я использую Django 1.0.2

Вот соответствующий код (спросите, нужно ли вам больше - и я не включаю HTML, потому что эта часть работает нормально):

Модель:

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)

Вид и форма:

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

1 Ответ

99 голосов
/ 25 марта 2009

Ну, я чувствую себя идиотом. Чтобы Django мог обрабатывать загруженные файлы, вам нужно передать переменную request.FILES в форму (имеет смысл, верно ?!)

В моем случае следующая строка идет от:

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

Кому:

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

Еще одна вещь, которую нужно проверить (если вы столкнетесь с чем-то подобным в будущем), это то, что ваша форма состоит из нескольких частей. Ваш тег <form> должен выглядеть примерно так:

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