Django Dopzone 表单未验证

Django Dopzone form is not validating

我正在尝试构建连接到我网站上 posts/listings 的多个图片上传器。我能够设置所有内容,但是当我点击上传时,表单未验证并且照片未保存。 这是我目前的情况。

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 表单。在你的观点中使用这个:

@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",路径将是“/media/uploads/...”。

所以最后这就是我要找的: model.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)

模板和我的问题一样。