【问题标题】:Django Dopzone form is not validatingDjango Dopzone 表单未验证
【发布时间】:2016-03-20 22:06:45
【问题描述】:

我正在尝试构建连接到我网站上的帖子/列表的多个图像上传器。我可以设置所有内容,但是当我单击上传时,表单未验证且照片未保存。 这是我到目前为止所拥有的。

models.py

class UploadFileModel(models.Model):
    # listing = models.ForeignKey(Listing, blank=False, default=1)
    file = models.ImageField(upload_to=settings.MEDIA_ROOT)

forms.py

class UploadFileForm(forms.ModelForm):
class Meta:
    model = UploadFileModel
    fields = ["file",]

views.py

def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
    for chunk in f.chunks():
        destination.write(chunk)

@require_POST
def upload(request, id):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        print request.FILES
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return HttpResponse(status=201)
        else:
            # print form.errors
            return HttpResponse(status=400)
    return HttpResponse(status=404)

def photo_upload(request, id):
    listing = get_object_or_404(Listing, id=id)
    context = {"listing": listing,}

    return render(request, "dropzone_photo.html", context)

最后这里是模板的一部分:

<form class="dropzone" id="my-awesome-dropzone" enctype="multipart/form-data">{% csrf_token %}
   <div class="dropzone-previews"></div> <!-- this is were the previews should be shown. -->
    <input type="hidden" name="listing" value="{{ listing.id }}" id="listing_id"/>
  <button type="submit" class="btn btn-primary">Upload</button>
</form>

我正在使用具有以下配置的 Dropzone.options.myAwesomeDropzone:

url: "/dropzone/upload/" + $("#listing_id").val(),
autoProcessQueue: false,
uploadMultiple: true,

【问题讨论】:

    标签: django dropzone.js


    【解决方案1】:

    您在这里并不需要 Django 表单。在你的观点中使用这个:

    @require_POST
    def upload(request, id):
        if request.method == "POST" and request.is_ajax():
            for filename, uploaded_file in request.FILES.iteritems():
                image = UploadFileModel()
                image.file = uploaded_file
                image.save()
                return HttpResponse(status=201)
        return HttpResponse(status=404)
    

    这行不通:

    file = models.ImageField(upload_to=settings.MEDIA_ROOT)
    

    您需要提供上传到的目录的名称,并且 MEDIA_ROOT 将由 Django 附加到该名称之前。示例:

    file = models.ImageField(upload_to="uploads")
    

    如果您的 MEDIA_ROOT 为“媒体”,则路径将为“/media/uploads/...”。

    【讨论】:

    • 感谢您的回复,您让我走上了正确的道路。在你的帮助下,我能够做出我想要的东西。您的代码唯一需要注意的是 return HttpResponse(status=201) 应该退出 for 循环,以便上传多个图像。
    • 我想我正在使用 ajax 并为每个上传的文件返回 201...无论如何,我很高兴它有帮助。
    【解决方案2】:

    所以最后这就是我想要的: 模型.py

    class UploadFileModel(models.Model):
    listing = models.ForeignKey(Listing, blank=False)
    file = models.ImageField(upload_to="uploads")
    

    view.py

    @require_POST
    def upload(request, id):
        if request.method == "POST" and request.is_ajax():
            for filename, uploaded_file in request.FILES.iteritems():
                print uploaded_file
                image = UploadFileModel()
                image.file = uploaded_file
                listing_instance = Listing.objects.get(id=id)
                image.listing = listing_instance
                image.save()
            return HttpResponse(status=201)
        return HttpResponse(status=404)
    
    def photo_upload(request, id):
        listing = get_object_or_404(Listing, id=id)
        context = {"listing": listing,}
        return render(request, "dropzone_photo.html", context)
    

    模板和我的问题一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2011-01-19
      • 2021-06-05
      • 2018-05-30
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      相关资源
      最近更新 更多