2013-07-17 1 views
5

私はこれを完全に困惑し、信じられないほど馬鹿なことをしているに違いありません。私は単にDjangoプロジェクトにファイルをアップロードしようとしています。問題は、フォームデータがサーバに渡されていないことです.csrfトークンだけです。私はDjango 1.5.1、Python 2.7、virtualenvをMac上で実行しており、組み込みのDjango開発サーバーを使用しています。request.FILESは常にファイルのアップロード時に空です

私のHTMLフォームは次のとおりです。

{% load url from future %} 

<form enctype="multipart/form-data" method="POST" action="{% url 'showreport' %}"> 
    {% csrf_token %} 
    <label>Upload grade csv file: </label> 
    <input type="hidden" id="testing" value="maybe" /> 
    <input type="file" id="grade_csv" /> 
    <input type="submit" value="Generate Report" /> 
</form> 

マイモデル:

from django.db import models 

class Document(models.Model): 
file = models.FileField(upload_to='/media/', blank=True, null=True) 

マイforms.py:

from django import forms 
from .models import Document 

class DocumentForm(forms.Form): 
""" 
to handle uploading grades csv file 
""" 
class Meta: 
    models = Document 

私のviews.py:

def report(request): 
""" 
Process the CSV file to remove inactive students 
Manipulate to get right JSON format 
Chart the results 
""" 
if request.method == 'POST': 
    form = DocumentForm(request.POST, request.FILES) 
    if form.is_valid(): 
     newfile = Document(file = request.FILES['file']) 
     newfile.save() 

     classdata = {} 
     studentdata = {} 

     return render(request, 'report/showreport.html', { 'classdata': classdata, 'studentdata': studentdata }) 
else: 
    form = UploadFileForm() 

return render(request, 'report/index.html', { 'form': form }) 

私は解決策を探すのに数時間を費やしましたが、何も動作していないようです。 I have the enctype set correctly(私が思う)、I am using input type 'submit' for the formI am binding the form data to my model(request.FILESは空であるので問題はありません)私もthis Django newbie pageごとに私のフォームアクション(アクション= '/レポート/ showreport /')で直接URLを使用してみましたが、それは違いはありませんでした。私が知る限り、フォーム送信アクションにバインドし、デフォルトアクションをオーバーライドする他のスクリプトはありません。

フォームの入力IDと一致するように[OK]をクリックする必要があります.FILES ['grades_csv'] ...まだrequest.FILESは空であるため、まだ問題ではありません。

デバッグしようとすると、私のビューでrequest.method == "POST"の直前にpdbトレースを設定しました。コンソールを使用すると、私の要求が表示されます.POSTには私の隠れた「テスト」入力とその要求は含まれていません。ファイルは空です。これをブラウザで実行すると、私のフォームページに戻ります。本質的に私のフォームは無効であると言っています。私のPDB結果はここにある:

"Key 'file' not found in <MultiValueDict: {}>" 

私は困惑午前:

(Pdb) request.FILES 
(Pdb) <MultiValueDict: {}> 
(Pdb) request.POST['testing'] 
(Pdb) *** MultiValueDictKeyError: "Key 'testing' not found in <QueryDict: {u'csrfmiddlewaretoken': [u'0tGCChxa3Po619dCi114Sb9jmWRt82aj']}>" 
(Pdb) request.POST 
<QueryDict: {u'csrfmiddlewaretoken': [u'0tGCChxa3Po619dCi114Sb9jmWRt82aj']}> 

私は、フォームが有効であるかどうかをチェックせずに、私のviews.pyでrequest.FILESにアクセスしようとすると、私はこのエラーを取得しますなぜ私はこれを動作させることができないのかについての助けを感謝する - それは単純なように思える。私は手動でpdbを使って自分のプロジェクトディレクトリ内のファイルを作成して書き込むことができるので、アクセス権が問題ではないと思います...問題はフォームにありますか?

+4

あなたのHTMLフォームは、名前が入力フィールドの属性、の Jingo

+4

のようにしてみてください欠けているように見えます私には疑わしいことがいくつかあります。あなたのフォーム入力に 'name'属性がありません。 'forms.Form'をサブクラス化していますが、' forms.ModelForm'が必要であることを示す 'Meta'クラスがあります。モデルフォームを使用する場合は、フォームがこれを行うため、Documentオブジェクトをインスタンス化する必要はありません。 –

+0

Genius - ありがとう!私はあなたが1つとしてそれを提出すれば答えとして受け入れることを嬉しく思っています... – user

答えて

1

私もこの問題を抱えており、しばらくの間困惑していました。私のエラーは同じだった - 私はinputフィールドに必要なフィールドが不足していた。実際に必要なフィールドが何であるかを見るために、行うには非常に素晴らしいものが、この場合には、

from base.forms import DocumentForm ## or put whatever the name is of the app, which is unspecified in the question 
print DocumentForm() 

これは、このオブジェクトのすべてのタグを含め、必要なHTMLを出力します必要です。初めて見逃した機能は非常に洗練されていますが、the docs.

+0

例を挙げることができますか? – shenk

3

formタグにenctypeプロパティが追加されていることを確認してください。official docsから

例: <form enctype="multipart/form-data" method="post" action="/foo/">

+0

完璧なソリューション。 enctype = "multipart/form-data"は私のためのトリックでした。本当に役に立つ。ありがとう@Kuznetsov – Doogle

関連する問題