Загрузка файлов в Django?

Моделька
class Attachment(models.Model):
...
    file = models.FileField(
        upload_to='/media',
        verbose_name='File'
    )
...

Форма
<form class="..." method="POST" id="..." enctype="multipart/form-data">
    {% csrf_token %}
    <div class="...">
        <button class="...">Upload files</button>
        <input type="file" name="files" id="files" multiple>
    </div>

    <div class="...">
        <button class="..." type="submit" form="...">Create</button>
    </div>
</form>

View
@csrf_protect
@login_required
def EditView(request,pk=None):

    if request.method == 'POST':
        try:
            ...
            for f in request.FILES.getlist('files'):
                post.attachments.append(f)

            post.full_clean()
            post.save()

            return redirect('/app/posts/' + str(post.id) + '/#comments')

        except ValidationError as e:
            ...

    context.update({
        'self': request.user,
        'post': post,
        'errors': errors,
        'messages': messages.get_messages(request)
    })

    return render_to_response('app/posts/edit.html', context, context_instance=RequestContext(request))

И кусок модельки в которой идет сохранение
class Post(models.Model):
    ...
    attachments = []

    def save(self, *args, **kwargs):
        super(Post, self).save(*args, **kwargs)

        if len(self.attachments) > 0:
            from .attachment import Attachment
            for attachment in self.attachments:
                a = Attachment(post=self.pk, file=attachment, original=str(attachment))
                a.full_clean()
                a.save()
        self.attachments = []


Ну а теперь вопрос к знатокам
Attachment не обязательное поле
При сохранении если файлики есть то они сохраняются, все отлично
Но если следом сделать еще один POST без аттачей то вылетает ошибка "I/O operation on closed file."
Получается что в request.FILES есть
[<InMemoryUploadedFile: file.txt (text/plain)>, ...]
с прошлого POST
Как их от туда убрать и где?
  • Вопрос задан
  • 1607 просмотров
Решения вопроса 1
@rakhinskiy Автор вопроса
Надо просто было выпить кофе)
Оказывается если в def save() обнулять self.attachments = [], то этого не достаточно
Надо было во view добавить
self.attachments = []
for f in request.FILES.getlist('files'):
    post.attachments.append(f)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы