django: двойная загрузка файлов: js и html - PullRequest
0 голосов
/ 22 марта 2012

У меня есть 2 модели django:

class Image(models.Model):
    name = models.CharField(max_length=100)
    photo = models.ImageField(upload_to='upload/', blank=True)

class  Preview(models.Model):
    photo = models.ImageField(upload_to='preview', blank=True)

Затем я создаю ImageForm с ModelForm и отображаю его в html-шаблоне.Я хочу сделать предварительный просмотр изображения на странице.Я использую https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin

<script src="/static/js/jquery.ui.widget.js"></script>
<script src="/static/js/jquery.iframe-transport.js"></script>
<script src="/static/js/jquery.fileupload.js"></script>
<script>
    $(function () {
        $('#id_photo').fileupload({
            dataType: 'json',
            url: '{% url preview %}',
            always: function (e, data) {
                $('#preview').css({'visibility': 'visible'});
                $('#preview').prepend('<img src=/static/'+data.result.url+' />')
            }
        });
    });
</script>

    <form method="POST" action="edit/" enctype="multipart/form-data">
    <div class="field">
        {{ form.photo.errors }}
        <label for="id_photo">Photo:</label>
        <input type="file" name="photo" id="id_photo" >
    </div>

    <div id="preview">
    </div>

    <input type="submit" name="Change">

Итак, с помощью javascipt я отправляю изображение на сервер, изменяю его размер (в представлении preview - он обрабатывает PreviewForm), сохраняю на диске и возвращаюURL, который вставляется в тег img.Оно работает.

После того, как я нажму кнопку Submit , я не могу получить файл изображения в моем представлении (edit, который обрабатывает ImageForm): request.FILES пусто !!!Когда я отключаю «загрузку изображения с помощью js», режим редактирования работает нормально: request.FILES содержит изображение, и я могу сохранить его ..

что вызывает исчезновение request.FILES во втором POST запросе?

1 Ответ

0 голосов
/ 22 марта 2012

Первое, что вам нужно выучить, это HTTP, это stateless протокол.Каждый запрос клиента к серверу уникален и не зависит от предыдущего.

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

Однако, как только вы выполните загрузку и покажете новую страницу, конечно request.POST будет пустым, потому что вы не загрузиличто-нибудь, файл уже находится на вашем сервере, ожидая подтверждения.

Правильным решением будет при подготовке предварительного просмотра создать несколько полей ввода hidden, которые помогут вам определить, какую фотографию вы хотите одобрить (unique ids в этом случае очень хороши, также не• раскрывать пути к файлам непосредственно для вашего клиента, если только вы не единственный, кто использует приложение).

Затем во втором запросе получите эти hidden field s, найдите изображение и сделайте то, что вы собираетесь делать;в вашем случае одобрите и опубликуйте его как-нибудь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...