2016-03-07 2 views
1
<script type="text/template" id="_escalation-container"> 
    <div class="response-container"> 
     <form action="" class="escalation-form" enctype="multipart/form-data">{% csrf_token %} 
       <a href="#" class="add-scripted-message">{% trans "Add Message" %}</a> 
      </div> 
      <div class="sub-content-footer" style="margin-top: 10px;"> 
       <input id="file" type="file" name="file"/> 
      </div> 
     </form> 
    </div> 
</script> 

Я смотрю Django official documentation и пытаюсь сделать то, что там написано.MultiValueDictKeyError при отправке приложения

View.py:

if request.POST: 
    form = EscalationForm(request.POST, request.FILES) 
    if form.is_valid(): 
     escalation_message = form.save(commit=False) 
     handle_uploaded_file(request.FILES['file']) 
     escalation_message.save() 

И handle_uploaded_file точно так же;

def handle_uploaded_file(f): 
    with open('some/file/name.txt', 'wb+') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 

EscalationForm.py:

class EscalationForm(forms.ModelForm): 
    class Meta: 
     model = EscalationMessage 

и моя модель:

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

Кроме того, я добавил их в мою settings.py;

FILE_UPLOAD_HANDLERS = [ 
    "django.core.files.uploadhandler.MemoryFileUploadHandler", 
    "django.core.files.uploadhandler.TemporaryFileUploadHandler" 
] 

Однако, когда я попытался отправить вложение это дало

File "/Users/mk/Documents/interaction/views.py", line 169, in create_escalation_message 
    escalation_message.file = EscalationMessage(file=request.FILES['file']) 
    File "/Users/mk/Documents/venvs/lib/python2.7/site-packages/django/utils/datastructures.py", line 322, in __getitem__ 
    raise MultiValueDictKeyError(repr(key)) 
MultiValueDictKeyError: "'file'" 

Я новичок в веб-разработки, и я пишу мини-демо. Я пытался отправить сообщение с вложением, но я искал пример, но он дал эту ошибку. Есть ли у вас какие-либо идеи об ошибке?

Спасибо

+1

Я не понимаю, ваша форма в views.py уже типовая форма модели 'EscalationMessage', почему вы делаете' escalation_message.file = EscalationMessage (...) '? Должно ли поле 'file'' 'FileField'? –

+0

ОК, это неправильно, как вы сказали, но я не могу использовать "escalation_message.file = request.FILES ['file']" этот тоже. Потому что, насколько я понимаю, это также неправильный способ обработки файла, есть ли у него правильный способ справиться с этим? – waterkinq

+0

Мне нужно обработать его, потому что после этого я отправлю электронное письмо, вложение которого является этим файлом. – waterkinq

ответ

0

загрузки файла необходимо использовать POST метод. Измените form тег:

<form action="" method="post" class="escalation-form" enctype="multipart/form-data"> 
Смежные вопросы