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?
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
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, –
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