代码之家  ›  专栏  ›  技术社区  ›  thecoloryes

Django Image Upload表单未显示错误消息

  •  0
  • thecoloryes  · 技术社区  · 11 年前

    我正在做一个项目,我当前的任务是允许用户上传新图像。我从这里找到的教程中编辑了代码: 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)
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   jproffitt    11 年前

    你只是在表单无效时重定向。因此,任何错误都将丢失,不会发生任何事情。我建议你把这两种观点结合起来。(没有理由将它们分开。)然后,当表单无效时,您可以返回到同一视图。以下是我的粗略实现:(未测试)

    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)
            )
        elif request.method=='POST':
            form = ImageForm(request.POST, request.FILES)
            if form.is_valid():
                u= User.objects.get(username=request.user)
    
                public_form = PublicImageForm(request.POST, request.FILES)
                if public_form.is_valid():
                    newdoc = UploadedImage(imagefile = request.FILES['imagefile'], owner=u, isPublic=True)
                else:
                    newdoc = UploadedImage(imagefile = request.FILES['imagefile'], owner=u, )
    
                newdoc.save()
    
                return HttpResponseRedirect('/workspace/upload_image/')
            else:
                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', 'POST'])