2016-03-20 19 views
0

私のウェブサイトの投稿/リストに接続されている複数の画像アップローダーを構築しようとしています。すべてを設定することができましたが、アップロードをクリックすると、フォームは検証されず、写真は保存されません。 ここに私が今持っているものがあります。Django Dopzoneフォームが有効ではありません

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, 

答えて

0

あなたが本当にここに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はジャンゴでその名前の前に付加されます。例:

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

MEDIA_ROOTが "media"の場合、パスは "/ media/uploads/..."になります。

+0

ご返信いただきありがとうございます、私は正しい道に私を置いています。あなたの助けを借りて、私が探していたものを作ることができました。あなたのコードに関するものは、複数のイメージをアップロードするために 'return HttpResponse(status = 201)'がforループでなければなりません。 – Azur

+0

私はajaxを使っていて、アップロードされたすべてのファイルに対して201を返すと思います...とにかく、助けてくれてうれしいです。 – somecallitblues

0

だから最後にこれは私が探していたものです:それは私の質問にあるよう 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) 

とテンプレートです。

関連する問題