Django inlineformset_factory. Request.FILES не возвращает имя файла в форму, когда formset.is_valid() = False
Я пытаюсь позволить пользователю загружать изображения, привязанные к проекту. Я делаю это с помощью inlineformset_factory.
Я предоставляю форму пользователю через представление, основанное на функциях. Когда пользователь не может правильно заполнить один (или более) из наборов форм, formset.is_valid() возвращает false и связанные наборы форм возвращаются пользователю вместе с сообщениями об ошибках. Проблема в том, что поле изображения не возвращается в связанную форму. Таким образом, если пользователь правильно заполнил 2 из 3 форм, то после неудачной валидации ни один из наборов форм не имеет связанного поля изображения. Я не могу понять, работает ли это так, как задумано, или я делаю что-то не так. Если я распечатаю request.FILES, то получу следующее:
<MultiValueDict: {'image_set-0-filename': [<InMemoryUploadedFile: IMG_0017.jpg (image/jpeg)>], 'image_set-1-filename': [<InMemoryUploadedFile: sprite.svg (image/svg+xml)>]}>
Я хочу, чтобы поле изображения было привязано и показывало пользователю, какое значение имеет поле.
перед неправильным отправлением формы
после неправильной отправки формы
Надеюсь, вы увидите, где моя ошибка, или подскажете мне, если я думаю об этом неправильно.
Заранее благодарю
forms.py
class EndUserImageForm(forms.ModelForm):
class Meta:
model = Image
fields = ["filename", "description"]
widgets = {
"filename": forms.FileInput(attrs={"class": "form__field no--outline"}),
"description": forms.Textarea(attrs={"class": "form__field no--outline", "placeholder": "Description"})
}
EndUserImageInlineFormset = inlineformset_factory(
Project, Image, form=EndUserImageForm, extra=2)
views.py
def image_formset(request, pk):
project = get_object_or_404(Project, pk=pk)
image_formset = EndUserImageInlineFormset(request.POST or None, request.FILES or None)
context = {
"image_formset": image_formset
}
if request.method == "POST":
if image_formset.is_valid():
images = image_formset.save(commit=False)
for image in images:
image.project = project
image.save()
return HttpResponseRedirect(reverse("projects:home"))
return render(request, "projects/test.html", context)
шаблон
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<h4>Add Images</h4>
{{ image_formset.non_form_errors }}
{{ image_formset.management_form }}
<div id="image-form-list">
{% for form in image_formset %}
{{ form.errors }}
<div class="image_form">
{{ form.filename }}
{{ form.description }}
</div>
{% endfor %}
</div>
<input type="submit" value="Save" class="button button--main activate"/>
</form>
models.py
class Image(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
filename = models.ImageField(upload_to=project_directory_path, blank=False)
description = models.CharField(max_length=350, blank=True)
created = models.DateTimeField(auto_now_add=True)
def image_formset(request, pk):
project = get_object_or_404(Project, pk=pk)
image_formset = EndUserImageInlineFormset()
if request.method == "POST": image_formset = EndUserImageInlineFormset(request.POST or None, request.FILES or None)
if image_formset.is_valid():h images = image_formset.save(commit=False) для image in images: image.project = project image.save()