Django JQuery Ajax-Datei-Upload

Lesezeit: 3 Minuten

Ich versuche seit Stunden, eine einfache Textdatei hochzuladen, aber ich kann es immer noch nicht zum Laufen bringen.

Ich erhalte immer wieder ungültige Formulare, die besagen, dass mir “file_source” fehlt.

Warum wird “file_source” nicht gepostet?

Ich habe es auch dazu gebracht, tatsächlich “file_source” zu senden, aber es sagt immer noch, dass es fehlt. Welche Art von Element sollte einem Django FileFiled gegeben werden?

Django-Formular:

class FileUploadForm(forms.Form):
    file_source = forms.FileField()

Django-Vorlage (Rendering-Formular):

<form action="/upload/" method="post" id="file-upload-form" enctype="multipart/form-data"> {% csrf_token %}
    {{ form }}
    <button type="submit" class="btn btn-primary" id='upload-btn'>Upload</button>
</form>

JQuery/Ajax-Upload:

function uploadFile() {
$.ajax({
    data: $(this).serialize(),
    type: $(this).attr('method'),
    url: $(this).attr('action')
});
return false;
}

$(function() {
     $('#file-upload-form').submit(uploadFile);
});

Django View, das POST erhält:

def upload_view(request):
if request.is_ajax():
    form = FileUploadForm(request.POST)
    if form.is_valid():
        print 'valid form'
    else:
        print 'invalid form'
        print form.errors
return HttpResponseRedirect('/ingest/')

  • Sie müssen FormData oder Flash oder Iframes verwenden, um Dateien zu senden. Ich empfehle die Verwendung von FormData, siehe diese Antwort stackoverflow.com/questions/20715606/post-data-using-ajax-post/…

    – Victor Castillo Torres

    29. Dezember 13 um 7:02 Uhr

  • mögliches Duplikat von Wie kann ich Dateien asynchron mit jQuery hochladen?

    – Nikolaus Cortot

    29. Dezember 2013 um 08:16 Uhr

  • @Nicolas Es ist ähnlich, aber nicht dasselbe. Ich brauchte einen Weg, um Django dazu zu bringen, den Ajax-Post richtig zu interpretieren.

    – armm

    30. Dezember 13 um 23:03 Uhr

Django JQuery Ajax Datei Upload
armm

Hier ist, was ich geändert habe, damit es funktioniert.

  1. Ich habe FormData verwendet, um Daten aus dem Formular zu verpacken

  2. Beachten Sie die Parameter des Formulars in der Django-Ansicht. Ich habe vorher keine “Dateien” angegeben und das hat den Fehler “Dateifeld erforderlich” verursacht.

Javascript:

function upload(event) {
event.preventDefault();
var data = new FormData($('form').get(0));

$.ajax({
    url: $(this).attr('action'),
    type: $(this).attr('method'),
    data: data,
    cache: false,
    processData: false,
    contentType: false,
    success: function(data) {
        alert('success');
    }
});
return false;
}

$(function() {
    $('form').submit(upload);
});

Django-Ansicht:

def upload_view(request):
    if request.method == 'POST':
        form = FileUploadForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            print 'valid form'
        else:
            print 'invalid form'
            print form.errors
    return HttpResponseRedirect('/ingest/')

  • könnten Sie Ihr Formular präsentieren

    – Andilabs

    26. März 15 um 12:02 Uhr

  • Was ist das FileUploadForm, das Sie verwenden?

    – wer auch immer

    6. Dezember 15 um 15:45 Uhr

  • das Formular ist in meiner ursprünglichen Frage

    – armm

    15. Januar 16 um 19:45 Uhr

  • Ich habe Ihren Code verwendet und er erhält 403, weil das CSRF-Token fehlt. Irgendeine Idee, wie man es löst?

    – Filippo Costa

    3. Juli 17 um 15:59 Uhr

  • Sie können @csrf_exempt verwenden

    – Kelvin Barsana

    2. November 17 um 8:40 Uhr

1643673668 711 Django JQuery Ajax Datei Upload
Abdallah Okasha

So können wir JSON-Daten zusätzlich zu Dateien mit Ajax an Django senden.

Beispiel:

JS mit Formulardaten

var formData = new FormData();
formData.append('file1', myFile); 
const data_ = JSON.stringify(data)
formData.append('data', data_);

doPost(url, formData)
.then(result => {
 })

Django mit request.FILES & request.POST

data = json.loads(request.POST.get('data'))
 files = request.FILES
 attached_file1 = files.get('file1', None)
 attr1 = data.get('attr1', None)

Sie können jQuery nicht verwenden, um Dateien asynchron hochzuladen. Ihre Optionen sind:

1. Senden Sie das Formular “auf dem üblichen Weg” ab. Dadurch wird die Seite natürlich aktualisiert.

2. Verwenden Sie XHR: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest Beachten Sie jedoch, dass es von IE 8/9 nicht unterstützt wird. In diesen Browsern müssten Sie auf einen Iframe und ein Formular zurückgreifen, das darauf postet, um einen asynchronen Upload nachzuahmen.

3. Verwenden https://github.com/blueimp/jQuery-File-Upload Es tut, was ich in 2. beschrieben habe, erspart Ihnen aber die gesamte Konfiguration.

  • Sie können FormData verwenden, meine Antwort anzeigen

    – armm

    30. Dezember 13 um 23:01 Uhr

  • Der Link, den ich angegeben habe, verwendet auch FormData, dies funktioniert jedoch nicht mit älteren Browsern (caniuse.com/#search=formdata), weshalb ich die anderen Links gegeben habe.

    – Jon Schnee

    31. Dezember 13 um 10:19 Uhr

.

720280cookie-checkDjango JQuery Ajax-Datei-Upload

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy