2009-03-11 7 views
10

Ho bisogno di convalidare il contenuto di un file XML caricato nel mio metodo Clean, ma non riesco ad aprire il file per la convalida. Funziona, nel metodo clean, il file non è stato ancora spostato dalla memoria (o dalla directory temporanea) alla directory di destinazione.Django: apre il file caricato mentre è ancora in memoria; Nel metodo Form Clean?

Ad esempio il seguente codice non funziona perché il file non è stato ancora spostato su quella destinazione. E 'ancora nella memoria (o la directory temporanea):

xml_file = cleaned_data.get('xml_file') 
xml_file_absolute = '%(1)s%(2)s' % {'1': settings.MEDIA_ROOT, '2': xml_file} 
xml_size = str(os.path.getsize(xml_file_absolute)) 

Quando guardo la variabile "cleaned_data" Dimostra questo:

{'xml_file': <InMemoryUploadedFile: texting.nzb (application/octet-stream)>} 

cleaned_data.get('xml_file') restituisce solo "texting.nzb" come una stringa.

C'è un altro modo per accedere al file in memoria (o nella directory temporanea)?


Ancora una volta, questo è nel metodo di mia forma clean che è legato in vista Amministrazione di default. Mi è stato detto più e più volte che tutta la validazione deve essere gestita in un modulo, non nella vista. Corretta?

risposta

15

Sto assumendo che hai tenuti il ​​modulo per i file utilizzando:

my_form = MyFormClass(request.POST, request.FILES) 

Se avete, una volta che il modulo è stato convalidato, è possibile accedere al contenuto del file stesso utilizzando i request.FILES Dizionario:

if my_form.is_valid(): 
    data = request.FILES['myfile'].read() 

I request.FILES [ 'myfile'] oggetto è un oggetto UploadedFile, in modo che supporta le operazioni di lettura/scrittura di file-like.

Se è necessario accedere ai contenuti del file dal metodo clean del modulo (o qualsiasi metodo del macchinario di pulizia), lo si sta facendo correttamente. cleaned_data.get('xml_file') restituisce un oggetto UploadedFile. Il metodo __str__ di quell'oggetto stampa semplicemente la stringa, motivo per cui viene visualizzato solo il nome del file. Tuttavia, è possibile ottenere l'accesso a tutti i contenuti:

xml_file = myform.cleaned_data.get('xml_file') 
print xml_file.read() 

Questa sezione dei documenti ha alcuni ottimi esempi: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/

+0

non ho scritto nulla in vista. Sto usando il metodo "clean" nel mio Form per eseguire la convalida, quindi test utilizzando la vista di amministrazione predefinita. Non sta facendo tutta la validazione in forma "Django way"? –

+0

Non importa dove lo fai. È necessario accedere a request.FILES per ottenere il file temporaneo come mostrato dai documenti. Puoi farlo all'interno della classe Form se vuoi. –

+0

Ho aggiornato la mia risposta con le istruzioni su come ottenere l'oggetto file caricato dall'interno del modulo stesso poiché, nel tuo caso, il file form.is_valid() ha bisogno. –

Problemi correlati