Django-表单模板为Imagefield抛出“此字段必填”

时间:2019-12-19 11:52:09

标签: django

我在Django 3.0中上传图片时遇到了一些麻烦。我遇到了一个问题,即使我选择了一个文件,尝试从模板上载图像也会引发错误“此字段为必填”。我可以从管理区域的表单中上传。

models.py

class Image(models.Model):
    title = models.CharField(max_length=50)
    image = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.title

views.py

def new_post_view(request):
    new_img = ImageForm(request.POST or None)

    if new_img.is_valid():
        new_img.save()
        new_img = ImageForm()
        return redirect('imageposts:gallery')
    return render(request, 'imageposts/create.html', {'new_pic': new_img})

forms.py

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

        widgets = {
            "title": forms.TextInput(),
            "image": forms.FileInput(),
        }

create.html

{% extends 'base.html' %}

{% block content %}
  <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{new_pic.as_p}}
    <button type="submit">Add image</button>
  </form>
{% endblock %}

我见过的解决方案是使该字段可为空和为空,但是在这种情况下,始终需要使用图像,但它只是不上传所选文件。该窗体只是清除文件部分,并引发“此字段是必需的”。我在django 3.0和django 2.2中都尝试过,得到的结果相同。我不知道这是怎么回事,对此我将不胜感激。

1 个答案:

答案 0 :(得分:2)

您的整个逻辑在这里是错误的。像这样更改视图

def new_post_view(request):
    img_form = ImageForm()
    #now check if the request is POST
    if request.method == 'POST':
       # you need request.files also since the Image is the Filefield
       img_form = ImageForm(request.POST,request.FILES) 
       if img_form.is_valid():
           img_form.save()
           return redirect('imageposts:gallery')
    return render(request, 'imageposts/create.html', {'form': img_form})

现在在模板而不是{{new_pic.as_p}}中执行{{form.as_p}}