2017-11-30 1 views
0

forms.py를 사용하여 파일을 가져 오려고합니다. 이 코드는 내가 다른 모델에 사용 된 동일한 코드이며 일을하지만,이 시간은 나에게이 오류 제공 :MultiValueDictKeyError Django 1.8

Views.py :

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

이 당신에 대해 알 필요가 코드의 조각입니다을

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'"** 

저는 파이썬 2.7.13과 장고 1.8을 사용하고 있습니다.

미리 감사드립니다.

+1

UploadRaw의 정의는 무엇입니까? 왜'request.POST'에 직접 접근하고 있습니까? –

+0

죄송합니다, form.py을 언급하는 것을 잊었습니다. 내 질문을 업데이트 할게. –

답변

1

rawnamerequest.POST이 아니기 때문에 오류가 발생합니다. 귀하의 경우, 양식 유효합니다, 따라서 request.POST 대신 양식의 cleaned_data 값을 얻는 것이 좋습니다. 당신이 request.POST에서 직접 데이터에 액세스하는 경우 키가 존재하는 경우

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

, 코드가 어느 검사, 이러한 가능성을 처리해야

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

또는 get() 방법을 사용하고 기본을 지정하여

.

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

마지막으로 양식이 의미가 없습니다. 일반 양식에는 Meta 클래스가 없으므로 필드는 Meta 클래스가 아닌 클래스 내부에서 정의해야합니다.

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

그런 다음, simplify your template 처음에 {{ form }}을 사용 : 같은

간단한 model form는 볼 수 있었다. 보기가 작동하면보기가 작동 할 때까지 할 수 있습니다. 원하는 경우 수동으로 render the fields 수 있습니다.

+0

cleaned_data 사용 후 다른 오류가 발생했습니다 : KeyError. –

+0

양식이 맞지 않기 때문입니다. – Alasdair

+0

글쎄, 나는 똑같은 것을 다른 형태로 사용했는데 잘 작동하고있다.이 이상한가? 한 가지 관점에서 작동하고 다른 관점에서 작동하지 않는 이유는 무엇입니까? –

관련 문제