2017-11-30 27 views
0

私はforms.pyを使用してファイルをインポートしようとしています。このコードは、私が別のモデルで使用され、それが働いていたが、今回はそれが私にこのエラーを与える同じコードです:MultiValueDictKeyError Django 1.8

MultiValueDictKeyError at /importraw 
Exception Value: "u'rawname'" 

これらは、あなたが知っておく必要があるコードの抜粋です:

Views.py

def importraw(request): 
    form = UploadRaw(request.POST, request.FILES) 
    if form.is_valid(): 
     raw = Raw(title=request.POST['rawname'], file='raw_files/' + request.POST['file']) 
     raw.save() 
     handle_uploaded_raw(request.FILES["file"], request.POST["name"]) 
     raw.save() 
    return redirect('/importations') 

Urls.py:

url(r'^importraw$', views.importraw), 

Forms.py:

class UploadRaw(forms.Form): 
    class Meta: 
     name = forms.CharField(max_length=120) 
     file = forms.FileField() 

Models.py:

class Raw(models.Model): 
    title = models.CharField(max_length=200) 
    file = models.FileField(upload_to='raw_files') 
    uploaded_at = models.DateTimeField(auto_now_add = True) 
    updated_at = models.DateTimeField(auto_now = True) 

    def __str__(self): 
     return self.name 

Index.htmlと

<!--IMPORT--> 
    <div class="col-md-12"> 
      <div class="panel panel-primary"> 
       <div class="panel-heading"> 
        <h3 class="panel-title">Importer un fichier brut</h3> 
        </div> 
        <div class="panel-body"> 
       <form class="form-horizontal" action="/importraw", method="post"> 
       {% csrf_token %} 
        <fieldset> 
        <div class="form-group"> 
         <label for="name" class="col-lg-4 control-label">Structure</label> 
         <div class="col-lg-6"> 
          <select name="id" id="id" class="struct form-control"> 
             {% for structure in structures %} 
              <option value="{{ structure.name }}">{{ structure }}</option> 
             {% endfor %} 
            </select> 
          </div> 
        </div> 
        <div class="form-group"> 
         <label for="file" class="col-lg-4 control-label">Nom du fichier brut</label> 
         <div class="col-lg-6"> 
          <input type="text" name="rawname" id="rawname" class="form-control"> 
         </div> 
         </div> 
        <div class="form-group"> 
         <label for="file" class="col-lg-5 control-label">Fichier brut</label> 
         <div class="col-lg-6"> 
          <input type="file" name="file" id="file"> 
         </div> 
         </div> 
        <div class="form-group"> 
         <div class="col-lg-10 col-lg-offset-2" align="center"> 
         <button type="submit" value="Create" class="btn btn-primary">Importer</button> 
         </div> 
        </div> 
        </fieldset> 
       </form> 
       </div> 
      </div> 
     </div> 

    <!--END-IMPORT--> 

私は取得しています正確なエラーについての詳細を知るためには、以下のトレースバックを見て取りください

**Environment: 
Request Method: POST 
Request URL: http://localhost:8000/importraw 
Django Version: 1.8 
Python Version: 2.7.13 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'backoffice'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 
Traceback: 
File "/home/kaiss/.local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/kaiss/Desktop/projet2/backoffice/views.py" in importraw 
    232.   raw = Raw(title=request.POST['rawname'], file='raw_files/' + request.POST['file']) 
File "/home/kaiss/.local/lib/python2.7/site-packages/django/utils/datastructures.py" in __getitem__ 
    322.    raise MultiValueDictKeyError(repr(key)) 
Exception Type: MultiValueDictKeyError at /importraw 
Exception Value: "u'rawname'"** 

私はPython 2.7.13とDjango 1.8を使用しています。

ありがとうございました!

+1

UploadRawの定義は何ですか?なぜ 'request.POST'に直接アクセスしていますか? –

+0

申し訳ございませんが、form.pyは忘れてしまいました。私は私の質問を更新します。 –

答えて

1

rawnamerequest.POSTにないため、エラーが発生します。あなたのケースでは、フォームが有効なので、request.POSTではなくフォームのcleaned_dataから値を取得するほうがよいでしょう。

if form.is_valid(): 
    raw = Raw(title=form.cleaned_data['title'], file='raw_files/' + request.POST['file']) 

あなたがrequest.POSTから直接データにアクセスする場合は、あなたのコードは、この可能性を処理する必要があり、いずれかのキーが存在する場合

if 'rawname' in request.POST: 
    rawname = request.POST['rawname'] 

またはget()方法を使用して、デフォルトを指定することで、チェック。

rawname = request.POST.get('rawname', '') 

最後に、フォームは意味をなさない。定期的なフォームはMetaクラスを持っていない、とフィールドがないMetaクラス内、クラス内で定義する必要があります。最初に{{ form }}を使用するように次に

class UploadRaw(forms.ModelForm): 
    class Meta: 
     fields = ('title', 'file') 

simplify your template

シンプルmodel formは次のようになります。ビューが機能したら、ビューが機能するまで実行できます。必要に応じて手動でrender the fieldsすることができます。

+0

cleaned_dataを使用した後、別のエラーが発生しました:KeyError。 –

+0

あなたのフォームは理にかなっていないからです。 – Alasdair

+0

まあ、私は別の形でまったく同じものを使用して、それはうまく動作しています、これは奇妙ではないですか?なぜそれは1つのビューで動作し、別のビューでは動作しないのですか? –

関連する問題