2010-02-02 3 views
6

Sto provando a creare un'interfaccia "cool" per l'upload delle immagini nel pannello di amministrazione di django. Il problema è che sto usando un'interfaccia inline per caricare istanze di immagini, ma sto usando il modulo jQuery Ajax per caricare le immagini, quindi c'era un altro modulo che dovevo creare per il caricamento. E ora django funzione di visualizzazione non può ricevere request.FILES da questa forma, perché ho creato senza utilizzare django.forms e non è possibile specificare in funzione di visualizzazione quale forma deve essere utilizzato. Pertanto, non è possibile sovrascrivere la funzione di visualizzazione standard per le interfacce in linea e non è possibile ricreare questo modulo utilizzando django.forms. Quindi, questo codice non sembra funzionare:Come ricevere il file caricato dalla forma in linea in django?

La mia forma:

<form id="uploadForm" enctype="multipart/form-data" method="post" action="upload_picture/"> 
    <input type="file" name="file" /> 
    <input type="submit" value="Upload" /> 
</form> 

La mia funzione di visualizzazione:

def upload_picture(request): 
    if request.method == 'POST': 
     save_original(request.FILES['file']) 
    return HttpResponseRedirect('admin/edit_inline/picture_editor.html') 

Forse dovrei farlo modo completamente diverso?

+1

Si noti che HttpResponseRedirect deve essere costruito con un percorso assoluto o un URL completo non uno relativo, come il proprio. HttpResponseRedirect ('/ admin/edit_inline/picture_editor.html') dovrebbe funzionare meglio. –

risposta

0

Ho testato questo codice e i file vengono caricati correttamente. Puoi mostrare la jquery che stai usando per costruire il tuo modulo?

Grazie.

0

Suggerisco di utilizzare un frammento di modello che genera il modulo, ma che può anche essere generato separatamente e inviato al jquery. questo preservers token CSRF e permette tou per analizzare il file con le forme correttamente

, ad esempio, si può usare:

$.ajax({ 
    url: "/uploadPicture?JustForm", 
    dataType: ($.browser.msie) ? "text" : "html", 
    success: function(data){ 
     // Put the form contained in data onto the page (it's a string) 
     $("formContainer").innerHtml(data) 
    } 
}); 

quindi avere il vostro modulo come restituito direttamente dalla vostra vista

def upload_picture(request): 
    if request.GET.has_key('JustForm'): 
     return YourFormObject.as_html() <- will include CSRF tags for compat with 1.2 
    if request.method == 'POST': 
     save_original(request.FILES['file']) 
    return HttpResponseRedirect('admin/edit_inline/picture_editor.html') 

(disprezzo errori palese, trattano come pseudocodice)

2

request.FILES dovrebbero funzionare bene con quella forma artigiana. Django non fa nulla di diverso con il campo tranne che aggiungendo id = "id_file". Sono abbastanza sicuro che il tuo non avere un ID non interferirebbe con il transfert in request.FILES.

In [5]: from django import forms 

In [6]: class GenericFileForm(forms.Form): 
    ...:   file = forms.FileField() 
    ...: 

In [7]: g = GenericFileForm() 

In [8]: print g 
<tr><th><label for="id_file">File:</label></th><td><input type="file" name="file" id="id_file" /></td></tr>