/ / Formulário de upload de imagem do Django inválido - django, django-forms, django-templates

Formulário de Upload de Imagens do Django não é válido - django, django-forms, django-templates

Por algum motivo no django a forma que soutentar usar não é considerado válido. Este código é obtido quase diretamente de um site que afirma que funciona, mas ainda não é funcional. meu código é o seguinte.

VISUALIZAÇÕES

def display_update_image(request, pk):
if request.method == "POST":
form = ImageForm(request.POST, request.FILES)
if form.is_valid():
display = Display.objects.get(pk = pk)
display.image = form.cleaned_data["image"]
display.save()
return HttpResponseRedirect(reverse("displays"))
else :
form = ImageForm()
return render(request, "catalog/update_display_image.html", {"form": form})

TEMPLATE (o nome do modelo é update_display_image.html)

<form method = "post" enctype = "multipart/form-data">{% csrf_token %}
<p>
<input id = "id" type = "file" class = "" name = "image">
</p>
<input type = "submit" value = "Submit" />

MODELOS

class Display(models.Model):
title = models.CharField(max_length = 50,)
image = models.ImageField(upload_to = "images")
id = models.UUIDField(primary_key = True, default = uuid.uuid4, unique = True)

def __str__(self):
return self.title

editar: esqueça de postar o código do Formulários, desculpe

class ImageForm(forms.Form):
image = forms.ImageField()

edição posterior: alterando minha classe de formulários para este

class ImageForm(forms.Form):
class Meta:
model = Display
fields = ("image",)

Permite que o formulário seja lido como válido por algum motivo, embora eu não entenda o porquê. Infelizmente, isso faz com que meu método de visualizações não funcione corretamente, pois não consegue mais ler

display.image = form.cleaned_data["image"]

Respostas:

2 para resposta № 1

Se você form class is a modelform: class ImageForm(forms.ModelForm): você pode passar a instância para o formulário e salvá-la.

def display_update_image(request, pk):
if request.method == "POST":
display = Display.objects.get(pk = pk)
form = ImageForm(request.POST, request.FILES, instance=display)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse("displays"))
else :
form = ImageForm()
return render(request, "catalog/update_display_image.html", {"form": form})

0 para resposta № 2

Dentro forms.py verifique se você tem um formulário Django como este:

class ImageForm(forms.ModelForm):
class Meta:
model = Display
fields = ["image",]

Dentro template adicionar {{ form }} em vez de usar manualmente input, como este:

<form method="post" enctype="multipart-formdata>
{% csrf_token %}
{{ form }}
<input type="submit" value="Update Image">