Django / Python: Как передать переменную из формы в скрипт на python с помощью метода POST?

#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() })