2010-01-06 23 views
30

Provare a utilizzare un modulo molto semplice per caricare un file in una nuova istanza di classe. Mi aspetto di avere entrambi i file in request.FILES ma è vuoto. Sono sul server dev in bundle.Empty Request.FILES con Django Carica moduli

Stato bloccato qui e ha attraversato tutte le domande correlate.

wayfinder_map.media_file = request.FILES['media_file'] 

genera

MultiValueDictKeyError: "Key 'media_file' not found in MultiValueDict: {}>"

modello

class WayfinderMap(models.Model): 
    """ Way-finding Map Config""" 


    media_file = models.FileField(upload_to="maps", null=True, blank=True) 
    wall_file = models.FileField(upload_to="maps_data", null=True, blank=True) 

vista

@login_required 
def create_map(request, form_class=WayfinderMapForm, template_name="wayfinder/map/create.html"): 
wayfinder_map_form = form_class(request.user, request.POST or None, request.FILES) 

    if wayfinder_map_form.is_valid(): 
     wayfinder_map = wayfinder_map_form.save(commit=False) 
     wayfinder_map.media_file = request.FILES['media_file'] 
     wayfinder_map.data_file = request.FILES['data_file'] 
     wayfinder_map.creator = request.user 
     wayfinder_map.save() 
    return HttpResponseRedirect(wayfinder_map.get_absolute_url()) 

return render_to_response(template_name, { 
    "wayfinder_map_form": wayfinder_map_form, 
}, context_instance=RequestContext(request)) 

modello

<form enctype="multipart/form-data" class="uniForm" id="wayfinder_map_form" method="POST" action=""> 
     <fieldset class="inlineLabels"> 
      {{ wayfinder_map_form|as_uni_form }} 
      <div class="form_block"> 
       <input type="hidden" name="action" value="create" /> 
       <input type="submit" value="{% trans 'create' %}"/> 
      </div> 
     </fieldset> 
    </form> 
+0

Penso che le risposte a questa domanda simile vi aiuteranno: http://stackoverflow.com/q/5895588/1037459 –

risposta

2

Sembra come request.FILES non è necessario in questo caso (cosa buona causa è vuoto ...)

ho modificato questa linea

wayfinder_map.media_file = request.FILES['media_file'] 

per

wayfinder_map.media_file = wayfinder_map_form.cleaned_data['media_file'] 

e funziona. Non sei sicuro di quale sia il modo giusto di fare la cosa ... -

0

Credo che i tuoi problemi possono trovarsi in classificare i dati relativi ad un modulo senza prima verificare la richiesta è POST

@login_required 
def create_map(request, form_class=WayfinderMapForm, template_name="wayfinder/map create.html"): 
    if request.method=='POST': 
    wayfinder_map_form = form_class(request.user, data=request.POST, files=request.FILES) 

    if wayfinder_map_form.is_valid(): 
     #save your data 
     return HttpResponseRedirect(wayfinder_map.get_absolute_url()) 

    else: 
    wayfinder_map_form=form_class(request.user) 

return render_to_response(template_name, {"wayfinder_map_form": wayfinder_map_form,}, context_instance=RequestContext(request)) 
+0

state usando in questo modo senza alcun problema finora. potrebbe essere un buon controllo (se necessario) ma certamente non risolve il problema come request.FILES è ancora vuoto – philgo20

+0

Cosa intendi per 'nessun problema fino ad ora'? Ha funzionato correttamente prima? Puoi pubblicare la tua classe di form? – czarchaic

+0

Quello che voglio dire è che ho usato i moduli senza problemi, a patto che non debba usare request.FILES, senza controllare se il metodo è POST. Richiede la vendita.POST ai dati nell'istanza della classe come fai tu potresti aiutare? Ci proverò e pubblicherò il mio modulo. – philgo20

140

vecchia domanda, ma qualcuno potrebbe ancora trovarlo utile.

in modo da avere i file caricati e <input type=file> showns in request.FILES, il modulo deve contenere enctype="multipart/form-data", ad esempio:

<form action="" method="post" enctype="multipart/form-data">{% csrf_token %} 
{{ form.as_p }} 
<button type="submit">{% trans 'Submit' %}</button> 
</form> 

altrimenti i file non saranno caricati e le vostre request.FILES sarà vuoto.

BTW Questa è una soluzione comune a un errore comune. Tuttavia, mi sono trovato ancora in una situazione con un FILES vuoto (e il file nel POST) quando tutto il resto sembrava OK. Ho la sensazione che fosse un limite di dimensioni ma non volevo dedicare più tempo al debugging, e ho semplicemente usato request.raw_post_data. Se mai qualcuno cade su questo problema si prega di aggiungere un commento (tra cui la versione django precisa!) E proverò a eseguire il debug in modo più approfondito.

+0

sì, che ha risolto il mio problema - grazie –

+14

Non so perché questa non è la soluzione accettata ... – Cerin

+3

Perché non risolve il problema degli autori. – haudoing