Django图片上传表单无效。

3

由于某些原因,在Django中我正在尝试使用的表单被认为是无效的。这段代码几乎直接来自一个声称它能工作的网站,但仍然无法正常运行。 我的代码如下。

视图

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})

模板(模板名称为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" />

模型

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

编辑:忘记发布表单代码了,抱歉。

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

进一步编辑:将我的表单类更改为以下内容
class ImageForm(forms.Form):
    class Meta:
        model = Display
        fields = ('image',)

出于某种原因,允许表单被视为有效,尽管我不知道为什么。然而,这会导致我的视图方法无法正常工作,因为它不能再读取。

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

你能发布ImageForm的代码吗? - Juan Diego Garcia
表单类与模型应该是 class ImageForm(forms.ModelForm): - Juan Diego Garcia
2个回答

4
如果您的表单是一个模型表单:class ImageForm(forms.ModelForm):,您可以将实例传递给表单并保存它。
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
forms.py 文件中,请检查您是否有一个类似于以下的 Django 表单:
class ImageForm(forms.ModelForm):
    class Meta:
        model = Display
        fields = ['image',]

template中添加{{ form }},而不是手动使用input,就像这样:
<form method='post' enctype='multipart-formdata>
{% csrf_token %}
{{ form }}
<input type='submit' value='Update Image'>

啊,抱歉我忘了提到我有一个类似的表单。一旦我将这两个文件更新为您提到的相同文件,它确实会将表单视为有效。不幸的是,当我点击提交后,我的视图无法识别form.cleaned_data['image']。 - user8265778
@user8265778,你能把你遇到的错误粘贴出来吗? - Piyush Maurya
关键错误在 /catalog/display/97ee7328-ccda-447d-b454-2ac53b0bf831/update-image/, 异常位置是我提到的那一行。 - user8265778
ImageForm(forms.ModelForm) 中正确缩进。 - Piyush Maurya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接