2011-10-05 10 views
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 %} 

私は何が間違っている可能性があるのアイデア?これに

+2

テンプレートコードも投稿できますか?重要な点の1つは、「request.FILESには、要求メソッドがPOSTで、要求を送信した

に属性enctype = "multipart/form-data"が含まれている場合にのみデータが含まれます。そうでない場合、request.FILESは空の。" – LaundroMat

+0

を参考にして、あなたは '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'は作成日である –

+2

フォームタグに** enctype = "multipart/form-data" **を追加することで問題は解決しましたが、 キーが]}> – jdickson

答えて

7

変更この...

handle_uploaded_file(request.FILES['file']) 

...

handle_uploaded_file(request.FILES['attachment']) 

ファイルは、フィールドの名前でPOSTデータに格納されています。

関連する問題