我正在做一个项目,我当前的任务是允许用户上传新图像。我从这里找到的教程中编辑了代码:
Need a minimal Django file upload example
。我最初遵循了教程,只是将“file”更改为“image”,因为我只允许上传图像,而且效果很好。然后,我尝试将其折叠到一个现有的Django项目中,我发现了我的问题:虽然我已经包含了所有的错误块,但当我尝试上传非图像的内容时,我没有收到任何错误消息。我已经包含了将图像标记为“公共”的功能,但即使我将其取出,错误消息也不会显示。为了使这项工作与项目的其他部分一起进行,我不得不将事情拆分得比教程中的内容更多,我想知道这是否是问题所在。
以下项目的相关代码。
样板
<form action="{% url "upload_image" %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>{{ form.non_field_errors }}</p>
<p>{{ form.imagefile.label_tag }} {{ form.imagefile.help_text }}</p>
<p>
{{ form.imagefile.errors }}
{{ form.imagefile }}
</p>
<p> {{ form.errors }}</p>
<p>{{ form.public }} {{ form.public.label }}</p>
<p><input type="submit" value="Upload" /></p>
</form>
形式
(我这里有两个表单,因为我不知道如何检查复选框的值。)
class ImageForm(Form):
imagefile=ImageField(label="Select image to upload.")
public=BooleanField(label="Public image", required=False)
class PublicImageForm(ImageForm):
public=BooleanField(label="Public image", required=True)
视图以呈现包含表单的页面
def upload_image_view(request):
if request.method=='GET':
form=ImageForm()
# TODO: Limits to images uploaded by current user
my_images = UploadedImage.objects.filter(owner=User.objects.get(username=request.user))
return render_to_response(
'uploader.html',
{'my_images': my_images, 'form': form,},
context_instance=RequestContext(request))
else:
return HttpResponseNotAllowed(['GET'])
接收表单的视图
def upload_new_image(request):
if request.method=='POST':
form = ImageForm(request.POST, request.FILES)
if form.is_valid():
u= User.objects.get(username=request.user)
form = PublicImageForm(request.POST, request.FILES)
if form.is_valid():
newdoc = UploadedImage(imagefile = request.FILES['imagefile'], owner=u, isPublic=True)
else:
newdoc = UploadedImage(imagefile = request.FILES['imagefile'], owner=u, )
newdoc.save()
# else:
# form = ImageForm()
return HttpResponseRedirect('/workspace/upload_image/')
else:
return HttpResponseNotAllowed(['POST'])
模型
class UploadedImage(models.Model):
imagefile=models.ImageField(upload_to="user_images/uploaded_images")
owner=models.ForeignKey(User)
isPublic=models.BooleanField(default=False)