2011-10-05 17 views
9

Sto provando a scrivere il modulo per caricare un file con Django. Il modulo di amministrazione funziona bene, ma il problema è che dopo aver fatto clic su Invia nel mio modulo, il modulo perde il file che ho selezionato (il nome del file scompare e "Nessun file scelto" appare accanto al pulsante "Scegli file"), e la vista non convaliderà il modulo perché manca il file. Il mio form/view/gestore file sembra proprio come lo django example.Come caricare un file con Django

forms.py

class AttachForm(forms.ModelForm): 
    class Meta: 
      model = Attachment 
      exclude = ('insp', 'contributor', 'date') 

views.py

def handle_uploaded_file(f): 
    destination = open('some/file/name.txt', 'wb+') 
    for chunk in f.chunks(): 
     destination.write(chunk) 
    destination.close() 

def attach(request, insp_id): 
    if request.method == 'POST': 
      form = AttachForm(request.POST, request.FILES) 
      if form.is_valid(): 
        handle_uploaded_file(request.FILES['file']) 
        f = form.save(commit=False) 
        f.contributor = request.user 
        f.insp = insp_id 
        f.save() 
        return HttpResponseRedirect(server + '/inspections/' + str(insp_id) + '/') 
    else: 
      form = AttachForm() 
    return render_to_response('attach.html', locals(), context_instance=RequestContext(request)) 

models.py

class Attachment(models.Model): 
    insp = models.ForeignKey(Inspection) 
    contributor = models.ForeignKey(User, related_name='+') 
    date = models.DateTimeField() 
    title = models.CharField(max_length=50) 
    attachment = models.FileField(upload_to='attachments') 
    def __unicode__(self): 
     return self.title 
    def save(self): 
     if self.date == None: 
      self.date = datetime.now() 
     super(Attachment, self).save() 
    class Meta: 
     ordering = ['-date'] 

attach.html

{% extends "base.html" %} 

{% block title %}Add Attachment{% endblock %} 

{% block content %} 
<h2>Attach File: Inspection {{ insp_id }}</h2> 
<p>This form is used to attach a file to an inspection.</p> 
<form action="." method="POST" autocomplete="off">{% csrf_token %} 
    <table cellspacing="10" cellpadding="1"> 
     {% for field in form %} 
      <tr> 
      <th align="left">    
       {{ field.label_tag }}: 
      </th> 
      <td> 
       {{ field }} 
      </td> 
      <td> 
       {{ field.errors|striptags }} 
      </td> 
     </tr> 
     {% endfor %} 
     <tr><td></td><td><input type="submit" value="Submit"></td></tr> 
    </table> 
</form> 
{% endblock %} 

Qualche idea su cosa potrei fare male?

+2

Potresti pubblicare anche il codice modello? Una cosa importante da ricordare è: "Notare che request.FILES conterrà solo i dati se il metodo di richiesta era POST e il

che ha pubblicato la richiesta ha l'attributo enctype =" multipart/form-data ". Altrimenti, request.FILES sarà vuoto." – LaundroMat

+0

come nota a margine, puoi usare le proprietà 'auto_now' e' auto_add_now' ([link to docs] (https://docs.djangoproject.com/en/1.3/ref/models/fields/#datefield)) per DateTimeFields in modo che non sia necessario sovrascrivere il metodo di salvataggio. 'auto_now' aggiorna la data ogni salvataggio e' auto_add_now' è solo la data di creazione, –

+2

L'aggiunta di ** enctype = "multipart/form-data" ** al tag form ha risolto il problema, ma ora genera un errore MultiValueDictKeyError con la descrizione " Chiave 'file' non trovata in ]}> " – jdickson

risposta

7

Modificare questa ...

handle_uploaded_file(request.FILES['file']) 

Per questo ...

handle_uploaded_file(request.FILES['attachment']) 

Il file è archiviato nei dati POST con il nome del campo.

Problemi correlati