2016-03-20 28 views
0

Ich versuche mehrere Bild-Uploader zu erstellen, die mit Posts/Listings auf meiner Website verbunden ist. Ich konnte alles einstellen, aber wenn ich auf Upload klicke, wird das Formular nicht validiert und Fotos werden nicht gespeichert. Hier ist, was ich bis jetzt habe.Django Dopzone Form validiert nicht

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) 

Und am Ende hier ist Teil der Vorlage:

<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> 

Ich verwende Dropzone.options.myAwesomeDropzone mit folgenden Konfiguration:

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

Antwort

0

Sie nicht wirklich brauchen eine Django-Form hier. Verwenden Sie diese ich Ihre Ansicht:

@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) 

Das wird nicht funktionieren:

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

Sie müssen den Namen des Verzeichnisses Ihr Hochladen und die MEDIA_ROOT zu diesem Namen Django vorangestellt wird liefern. Beispiel:

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

Der Weg wird dann "/ media/uploads/...", wenn Ihr MEDIA_ROOT ist "Medien".

+0

Vielen Dank für Ihre Antwort, Sie haben mich auf den richtigen Weg gesetzt. Mit Deiner Hilfe konnte ich machen, wonach ich gesucht habe. Das einzige Problem an Ihrem Code ist, dass 'return HttpResponse (status = 201)' außerhalb der for-Schleife liegen sollte, um mehr als ein Bild hochzuladen. – Azur

+0

Ich glaube, ich benutzte Ajax und gab 201 für jede hochgeladene Datei zurück ... Jedenfalls bin ich froh, dass es geholfen hat. – somecallitblues

0

Also am Ende ist es das, was ich suchte: 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) 

und Vorlage ist, wie es in meiner Frage.