Форма Django для обновления объекта не сохраняет файлы

#python #django #forms #file

#python #django #формы #файл

Вопрос:

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

Моя проблема заключается в следующем: когда я перехожу к представлению обновления, которое я создал для работы, старое изображение (которое уже есть в базе данных) отображается в форме, но отсутствует в самом поле. В нем указано current: [имя изображения], а затем обычное поле filefield с меткой edit .

Я не хочу, чтобы пользователь мог обновлять работу только в том случае, если они снова загружают изображение. Как мне передать текущее изображение в форму?

 #models.py
class Work(models.Model):
    name = models.CharField(max_length=255) 
    image = models.ImageField( upload_to="images" )

#forms.py
class Meta:
    model = Work
    exclude = ('slug',)

#views.py
def workEdit(request, pk):

    if request.method == "POST":
        form = WorkForm(request.POST, request.FILES)

        if form.is_valid():
            new_work = form.save(commit=True)
            return redirect("/portfolio/beheer/werk")
    else:
        print(form)
        print(form.errors)
    else:
        work = get_object_or_404(Work, pk=pk)
        form = WorkForm(request.POST ,request.FILES, instance=work)



context = {

    'form': form,

}
return render(request, 'submit.html', context)
 

Комментарии:

1. Это в форме, и ее не нужно загружать снова. Это уже то, что вы хотите. (Браузеры не позволяют вам предварительно заполнять поле загрузки файла по соображениям безопасности.)

2. Если я нажму «обновить» (созданную мной кнопку), я потеряю предыдущее изображение, если я не загрузил новое. Как это можно решить?

3. Ну, в том виде, в котором у вас есть код сейчас, все будет воссоздано при сохранении — потому что вы не передаете instance атрибут при создании экземпляра формы в POST.

4. Это полностью исправило проблему, переместило get_or_404 в первую строку представления функции. Большое спасибо.