#python #django #forms
#python #django #формы
Вопрос:
Я получаю эту ошибку при отправке:
CSRF verification failed. Request aborted.
Я зашел так далеко, следуя документации, но я не до конца ее понимаю, и это определенно неправильно. Я просто хочу взять слово запроса из моего окна поиска (форма) и передать его скрипту python в качестве аргумента. Я новичок в Django и зацикливаюсь на самых простых вещах.
В models.py:
class QueryForm(forms.Form):
query = forms.CharField(label='query',max_length=100)
Я добавил эту строку в свой urls.py
url(r'^results/$', 'tweemo.views.results'),
На моей домашней странице, где находится мое окно поиска, у меня есть этот код для моей формы:
<form action="/home/results/" method="post">
<label for="query">Search:</label>
<input id="query" type="text" name="query" value="{{ current_query }}">
<input type="submit" value="ok">
</form>
В views.py Я добавил эти две функции:
def get_query(request):
if request.method == 'POST':
form = QueryForm(request.POST)
if form.isvalid():
return HttpResponseRedirect('/thanks/')
else:
form = QueryForm()
return render(request, 'results.html', {'form': form})
def results(request):
return render_to_response('results.html',{'here':TwitterStream.objects.all() })
МОЙ results.html содержит только это:
<form action="/home/results/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit"/>
</form>
Комментарии:
1. Вам нужно
{% csrf_token %}
вот так…<form ...>{% csrf_token %}
Другое дело — не очень хорошая идея обслуживать/search
запросы какPOST
. Причина в том, что использование может добавить ссылку в закладки и т.д., Если это запрос GET (простота использования.)
Ответ №1:
Вы должны просто добавить {% csrf_token %}
тег внутри КАЖДОГО <form></form>
тега, у которого есть метод, который должен быть post
в вашем шаблоне.
Итак, приведенная ниже разметка должна быть исправлена:
<form action="/home/results/" method="post">
{% csrf_token %}
<label for="query">Search:</label>
<input id="query" type="text" name="query" value="{{ current_query }}">
<input type="submit" value="ok">
</form>
Комментарии:
1. Спасибо, но на самом деле это ничего не исправило.
2. Итак, я хочу спросить, с какой страницы и с какой формы вы отправили сообщение, которое приводит к ошибке? Какой
method
атрибут этой формы?CSRF verification
Ошибка возникает только тогда, когда форма была отправлена с помощьюpost
метода и не содержит поля ‘csrf_token’. @COOLBEANS
Ответ №2:
Проблема в том, что вы не передаете токен csrf в форму, вам нужно передать токен csrf в функцию визуализации, чтобы он был применен в форме. Для достижения этого вам необходимо связать токен csrf с запросом.
def get_query(request):
if request.method == 'POST':
form = QueryForm(request.POST)
if form.isvalid():
return HttpResponseRedirect('/thanks/')
else:
form = QueryForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('results.html', args)
def results(request):
return render_to_response('results.html',{'here':TwitterStream.objects.all() })