Проверка Django CSRF не удалась

Я новичок в Django, и у меня проблема с проверкой CSRF. До сих пор я создавал Django POST-формы, которые успешно работают и не имеют ошибок CSRF. Но когда я пытаюсь создать следующую форму, я получаю сообщение об ошибке проверки CSRF: «Токен CSRF отсутствует или неверен».

{% for a in answers %}
    {% csrf_token %}
    <form class="" action="." method="post">
        <input type="submit" value="{{ a.answer }}" name={{a.answer_id}}></input>
    </form>
    <p>Number of votes: {{ a.votes }}</p>
{% empty %}
    <p>There are no answers for the poll</p>
{% endfor %}

Вот как выглядят модели:

class Question(models.Model):
    date_added = models.DateTimeField(auto_now_add=True)
    question = models.CharField(max_length=200)
    number_of_answers = models.IntegerField(default=0)

class Answer(models.Model):
    question = models.ForeignKey(Question)
    answer = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

Вот как выглядит функция просмотра для этой формы (пока я не добавлял никакого кода для обработки почтового запроса):

def poll(request, question_id):
    if request.method == "POST":
        pass
    poll = Question.objects.get(id=question_id)
    answers = poll.answer_set.order_by()
    context = {'poll' : poll, 'answers' : answers}
    return render(request, 'polls/poll.html', context)

По сути, на каждый вопрос есть несколько ответов. Я хочу разрешить пользователю нажимать кнопку, связанную с конкретным ответом. Как только пользователь нажимает кнопку, я хочу увеличить количество голосов за этот ответ в базе данных (я еще не добавил код для этого, но это цель). Затем я хочу, чтобы страница перезагрузилась с добавленным голосованием.

Это просто пример того, как это выглядит визуально

Кто-нибудь знает, что я делаю неправильно или чего мне не хватает?

Благодарю вас!


person km786    schedule 20.12.2017    source источник


Ответы (1)


Токен csrf находится внутри формы:

<form class="" action="." method="post">
 {% csrf_token %} <!--here goes the token-->
    <input type="submit" value="{{ a.answer }}" name={{a.answer_id}}></input>
</form>
person schrodigerscatcuriosity    schedule 20.12.2017
comment
Привет, спасибо за ваш ответ. Да, я пробовал это, и я получаю ту же ошибку. - person km786; 21.12.2017
comment
Вы перезагрузили страницу? - person schrodigerscatcuriosity; 21.12.2017
comment
Это в основном правильно, но в приведенном выше коде есть несколько проблем. Во-первых, нет формы python, которая могла бы проверить токен CSRF, во-вторых, есть много форм (потому что у вас есть тег формы внутри цикла). Это не может работать таким образом. Создайте правильную форму Python, которой нужна только одна форма в HTML, чтобы обойти сбои. - person dahrens; 21.12.2017
comment
@dahrens Как я понял, нет проблем со многими формами, каждая из которых имеет свой собственный csrf. Вы говорите, что это не сработает, потому что это петля? - person schrodigerscatcuriosity; 21.12.2017
comment
@guillermochamorro Теперь это работает! Как только я перезагрузил страницу, все заработало. Я не знал, что я должен был сделать это, спасибо! - person km786; 21.12.2017