9
Djangoでファイルをアップロードするためのフォームを作成しようとしています。管理フォームはうまく動作しますが、フォームで送信をクリックすると、フォームは選択したファイルを失います(ファイル名が表示されず、[ファイルを選択]ボタンの横に[ファイルが選択されていません]ファイルが存在しないためフォームを検証しません。私のフォーム/ビュー/ファイルハンドラは、django exampleのように見えます。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 %}
私は何が間違っている可能性があるのアイデア?これに
テンプレートコードも投稿できますか?重要な点の1つは、「request.FILESには、要求メソッドがPOSTで、要求を送信した
を参考にして、あなたは 'auto_now'と' auto_add_now'([link to docs](https://docs.djangoproject.com/ja/1.3/ref/models/fields/#datefield))のプロパティを使うことができますDateTimeFieldsを使用して、saveメソッドをオーバーライドする必要はありません。 'auto_now'は保存するたびに日付を更新し、' auto_add_now'は作成日である –
フォームタグに** enctype = "multipart/form-data" **を追加することで問題は解決しましたが、キーが]}> –
jdickson