2013-04-08 2 views
0

У меня есть шаблон, который генерирует 2 формы. Формы используются для извлечения данных через POSTMultiValueDictKeyError at/boardeditor/

Проблема заключается в том, что пользователь вводит данные с помощью POST, например, удаляет имя входного атрибута, называемое процессом.

----------------------------- 4827543632391 \ r \ nContent-Disposition: form-data; Name = "csrfmiddlewaretoken" \ г \ п \ г \ nYWSIqoP9MjdKYlauwT5fSdxtFH2rcoaH \ г \ п ----------------------------- 4827543632391 \ г \ nContent-Disposition: form-data; имя = "доска" \ г \ п \ г \ п \ г \ п ----------------------------- 4827543632391 \ г \ nContent-Disposition: form-data; имя = "процесс" \ г \ п \ г \ nУдалить, \ г \ п ----------------------------- 4827543632391 - \ r \ n

Я получаю эту ошибку. Если пользователь удаляет процесс значения из имени.

Как я могу бороться с этой ошибкой и не допускать вмешательства пользователя в форму.

MultiValueDictKeyError at /whiteboardeditor/ 

Key 'process' not found in <QueryDict: {u'': [u'delete'], u'csrfmiddlewaretoken':  [u'YWSIqoP9MjdKYlauwT5fSdxtFH2rcoaH'], u'board': [u'2']}> 
File "C:\o\17\mysite\pet\views.py" in WhiteBoardEditor 
    362.    if request.POST['process'] == 'primary': 
File "C:\Python26\lib\site-packages\django\utils\datastructures.py" in __getitem__ 
    258.    raise MultiValueDictKeyError("Key %r not found in %r" % (key, self)) 

Exception Type: MultiValueDictKeyError at /whiteboardeditor/ 
Exception Value: Key 'process' not found in <QueryDict: {u'': [u'delete'],  u'csrfmiddlewaretoken': [u'YWSIqoP9MjdKYlauwT5fSdxtFH2rcoaH'], u'board': [u'2']}> 

Мой HTML

<form method="POST" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ boardpicture.as_p }} 
<input type = "hidden" name="process" value= "primary" /> 
<input type = "submit" value= "save" /> 
</form> 

     {% for p in picture %} 
<li><a href ="{% url world:delpic p.id 1 %}">{{p.description}}</a> 
{% endfor %} 




<form method="POST" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ picturedelete.as_p }} 
    <input type = "hidden" name="process" value= "delete" /> 
    <input type = "submit" value= "save" /> 

</form> 

</form> 
{% for pi in pict %} 
<li><a href ="{% url world:delpic pi.id 2 %}">{{ pi.description }}</a> 
{% endfor %} 

Мой views.py

def WhiteBoardEditor(request): 
    if not request.user.is_authenticated(): 
    return HttpResponseRedirect(reverse('world:LoginRequest')) 
picture = {} 
pict = {} 

if request.method == "POST": 
     forms = WhiteBoardPictureForm(request.user,request.POST,) 
     formss = PictureDeleteForm(request.user,request.POST,) 
     if request.POST['process'] == 'primary': 
      if forms.is_valid(): 
       board = forms.cleaned_data['board'] 
      if board: 
       boards = forms.cleaned_data['board'] 
       picture = Picture.objects.filter(board=boards) 
      return render(request,'boardeditor.html',{ 
       'picture':picture, 
       'boardpicture':WhiteBoardPictureForm(request.user), 
       'picturedelete':PictureDeleteForm(request.user)}) 

     elif request.POST['process'] == 'delete': 
      if formss.is_valid(): 
       pooh = formss.cleaned_data['board'] 
       if pooh: 
        pooh = formss.cleaned_data['board'] 
        pict = Picture.objects.filter(board=pooh) 
      return render(request,'boardeditor.html',{ 
      'pict':pict, 
      'boardpicture':WhiteBoardPictureForm(request.user), 
      'picturedelete':PictureDeleteForm(request.user)}) 

      return render(request,'boardeditor.html',{'board':WhiteBoardNameForm(request.user),'boardpicture':WhiteBoardPictureForm(request.user),'picturedelete':PictureDeleteForm(request.user)}) 

Мой views.py

class WhiteBoardPictureForm(forms.ModelForm): 

     def __init__(self, user, *args, **kwargs): 
       super(WhiteBoardPictureForm, self).__init__(*args, **kwargs) 
       self.fields['board'].queryset = Board.objects.filter(user=user) 

    class Meta: 
     model = Picture 
     fields = ('board',) 

class PictureDeleteForm(forms.ModelForm): 

     def __init__(self, user, *args, **kwargs): 
       super(PictureDeleteForm, self).__init__(*args, **kwargs) 
       self.fields['board'].queryset = Board.objects.filter(user=user) 

    class Meta: 
     model = Picture 
     fields = ('board',) 

ответ

1

Вы должны подтвердить формы перед обработкой, как form.is_valid() и возврат соответствующий страница с формой и ошибками, если ее недействительно.

Если формы действительны, используйте form.cleaned_data для опубликованных данных, а не request.POST.

Вот как использовать формы Using forms in view

Так что либо вы можете добавить process поле ввода в форме.

Или для этого конкретного экземпляра, вы можете добавить проверку на ваш взгляд, перед обработкой формы, как

if request.POST.has_key('process'): 
    # return error 
+0

Рохана Если пользователь удаляет csrfmiddlewaretoken. Я получаю эту ошибку. Ошибка CSRF не удалась. Запрос прерван. , У меня проблемы с этой ошибкой. Не могли бы вы помочь мне? Спасибо Rohan – donkeyboy72

+0

@ donkeyboy72, то есть функция django для защиты от перекрестных ссылок сайтов. Проверьте документацию https://docs.djangoproject.com/en/dev/ref/contrib/csrf/ и посмотрите, что и как вы можете сделать. – Rohan

+0

Rohan Большое спасибо. Ты замечательный человек – donkeyboy72

Смежные вопросы