У меня есть шаблон, который генерирует 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',)
Рохана Если пользователь удаляет csrfmiddlewaretoken. Я получаю эту ошибку. Ошибка CSRF не удалась. Запрос прерван. , У меня проблемы с этой ошибкой. Не могли бы вы помочь мне? Спасибо Rohan – donkeyboy72
@ donkeyboy72, то есть функция django для защиты от перекрестных ссылок сайтов. Проверьте документацию https://docs.djangoproject.com/en/dev/ref/contrib/csrf/ и посмотрите, что и как вы можете сделать. – Rohan
Rohan Большое спасибо. Ты замечательный человек – donkeyboy72