Django Dopzone表单未验证

Django Dopzone表单未验证,django,dropzone.js,Django,Dropzone.js,我试图建立多个图像上传连接到我的网站上的帖子/列表。我可以设置所有内容,但当我单击“上载”时,表单无法验证,照片也无法保存。 这是我到目前为止的情况 models.py class UploadFileModel(models.Model): # listing = models.ForeignKey(Listing, blank=False, default=1) file = models.ImageField(upload_to=settings.MEDIA_ROOT)

我试图建立多个图像上传连接到我的网站上的帖子/列表。我可以设置所有内容,但当我单击“上载”时,表单无法验证,照片也无法保存。 这是我到目前为止的情况

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>

在这里你不需要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)
您需要提供上载到的目录的名称,Django将在该名称前面加上MEDIA_ROOT。例如:

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

如果您的媒体根目录是“媒体”,那么路径将是“/media/uploads/…”。

因此,最后这就是我要寻找的: model.py

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)

模板和我的问题一样。

谢谢你的回复,你让我走上了正确的道路。在你的帮助下,我能够完成我所寻找的。关于你的代码,唯一的一点是
return-HttpResponse(status=201)
应该在for-loop之外,以便上传多个图像。我想我是在使用ajax,并为上传的每个文件返回201。。。不管怎样,我很高兴这有帮助。
class UploadFileModel(models.Model):
listing = models.ForeignKey(Listing, blank=False)
file = models.ImageField(upload_to="uploads")
@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)