我在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中都尝试过,得到的结果相同。我不知道这是怎么回事,对此我将不胜感激。
答案 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}}