Django Dopzone表单未验证
我试图建立多个图像上传连接到我的网站上的帖子/列表。我可以设置所有内容,但当我单击“上载”时,表单无法验证,照片也无法保存。 这是我到目前为止的情况 models.pyDjango 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)
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)