Проверка CSRF, в шаблонах Django - PullRequest
1 голос
/ 13 марта 2012

Я пытался создать форму в своем пользовательском теге шаблона, а затем попытаться создать там HTML-форму, а затем просто использовать ее внутри своих шаблонов, но я получаю ошибку CSRF Verification Failed, когда пользователь отправляет форму (и это естественно, потому что я не предоставил форму внутри тега шаблона с помощью csrf_token), я сделал вот что:

@register.simple_tag(takes_context=True)
def change_password_(context):
    csrf = context.get('csrf_token', '')
    html = "<form action='{% url change_password %}' method='post' id='renew_password' >"
    csrf_string = str(csrf)
    html += "<input type='hidden' value='%' />" %csrf_string
....

но я все еще получаю ошибку проверки CSRF :( Есть идеи, как заставить это работать?
Спасибо

Ответы [ 3 ]

2 голосов
/ 13 марта 2012

Во-первых, попробуйте напечатать csrf в теге шаблона или проверьте визуализированный html, чтобы убедиться, что тег шаблона успешно получает csrf_token из контекста шаблона.

Во-вторых, ваш тег csrfне имеет атрибута имени.Попробуйте следующее:

html += "<input type='hidden' name='csrfmiddlewaretoken' value='%' />" %csrf_string

Наконец, я хотел бы написать ваш шаблонный тег как тег включения .Это переместит HTML в отдельный шаблон, который будет выглядеть аккуратнее.Затем вы можете использовать {% csrf_token %} в файле шаблона тега.

0 голосов
/ 13 марта 2012

Глядя на форму, которую я создал с использованием шаблонов, у меня есть этот фрагмент:

<form action="" method="post">
<div style='display:none'><input type='hidden'  name='csrfmiddlewaretoken'
value='e987effa0c6ee111225a3c0edc927b06' /></div><table>

Может быть, это даст вам представление о том, как поместить это прямо в вашу разметку

0 голосов
/ 13 марта 2012

Вам нужен {% csrf_token %} после тега формы вместо скрытого ввода.

Прочитайте эту статью для получения дополнительной информации.

...