Повторная отправка изображения в ImageField после ошибки проверки в Django - PullRequest
4 голосов
/ 14 марта 2011

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

Есть идеи, как каким-то образом перезагрузить уже отправленное изображение в форму, чтобы разрешить сохранение изображения?

Спасибо!

ТАК интересные кусочки кода:

class DealForm(forms.ModelForm):
    image = forms.ImageField(required=False,widget=AdminImageWidget)

    def clean():
        data = self.cleaned_data
        date_start = data.get('date_start')
        date_end = data.get('date_end')
        (... several other validations ...)
        return data

.

class AdminImageWidget(forms.FileInput):
    def __init__(self, attrs={}):
        super(AdminImageWidget, self).__init__(attrs)

    def render(self, name, value, attrs=None):
        output = []
        if value and hasattr(value, "url"):
            output.append(('<a target="_blank" href="%s">' 
                            '<img src="%s" /></a> '
                            % (value.url, value.url_200x150)))
        output.append(super(AdminImageWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))

Ответы [ 2 ]

6 голосов
/ 14 марта 2011

HTML <input type="file"> поля не могут быть предварительно заполнены данными.Поэтому, если проверка не удалась в другом поле, вам придется повторно выбрать изображение.

Это мера безопасности HTML / браузера.Как ни крути!

Представьте, может ли сайт добавить C:\Windows\something_important в форму в углу страницы?


Если это критически важная функциональность, вы можете ...

  1. Принудительно загрузить файл перед проверкой формы и сохранить имя файла в сеансе пользователя
  2. Настройте шаблон для отображения сообщения об успехе при повторном отображении, если файл загружен
  3. Отключите проверку поля файла, когда сеанс содержит информацию о загрузке
  4. Извлеките имя файла из сеанса послеИстинно действительная отправка формы
5 голосов
/ 03 августа 2011

Вот приложение django, которое называется django-file-resubmit. Это решает именно эту проблему.

https://github.com/un1t/django-file-resubmit

...