【问题标题】:Django Image Upload Form not validDjango 图片上传表单无效
【发布时间】:2017-12-10 16:11:46
【问题描述】:

出于某种原因,在 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的解码吗?
  • 带有模型的表单类应该是class ImageForm(forms.ModelForm):

标签: django django-forms django-templates


【解决方案1】:

如果您的表单类是模型表单: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})

【讨论】:

    【解决方案2】:

    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 你能粘贴你得到的错误吗?
    • KeyError at /catalog/display/97ee7328-ccda-447d-b454-2ac53b0bf831/update-image/ 异常位置是我提到的那一行
    • 正确缩进ImageForm(forms.ModelForm)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2017-08-02
    • 2011-09-15
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多