私はこれを完全に困惑し、信じられないほど馬鹿なことをしているに違いありません。私は単に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 form、I 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を使って自分のプロジェクトディレクトリ内のファイルを作成して書き込むことができるので、アクセス権が問題ではないと思います...問題はフォームにありますか?
あなたのHTMLフォームは、名前が入力フィールドの属性、の – Jingo
のようにしてみてください欠けているように見えます私には疑わしいことがいくつかあります。あなたのフォーム入力に 'name'属性がありません。 'forms.Form'をサブクラス化していますが、' forms.ModelForm'が必要であることを示す 'Meta'クラスがあります。モデルフォームを使用する場合は、フォームがこれを行うため、Documentオブジェクトをインスタンス化する必要はありません。 –
Genius - ありがとう!私はあなたが1つとしてそれを提出すれば答えとして受け入れることを嬉しく思っています... – user