django 1.10 csrf_令牌未创建隐藏输入字段
我有一个表单,但是Django没有创建一个隐藏的输入,比如-django 1.10 csrf_令牌未创建隐藏输入字段,django,csrf,Django,Csrf,我有一个表单,但是Django没有创建一个隐藏的输入,比如- <input type="hidden" name="csrfmiddlewaretoken" value="80NGejzAPl2aCbEEuyLqIT3ppMTJLilY"> views.py from django.core.mail import BadHeaderError, send_mail from django.http import HttpResponse, HttpResponseRedirect
<input type="hidden" name="csrfmiddlewaretoken" value="80NGejzAPl2aCbEEuyLqIT3ppMTJLilY">
views.py
from django.core.mail import BadHeaderError, send_mail
from django.http import HttpResponse, HttpResponseRedirect, request
from django.shortcuts import render, render_to_response
from django.template import RequestContext
from django.template.context_processors import csrf
from django.contrib import messages
def callback(request):
phone = request.POST.get('phone', None)
lastpath = request.POST.get('lastpath', None)
if validatePhone(phone):
if sendMail(phone):
messages.success(request, 'Мы скоро перезвоним Вам')
return HttpResponseRedirect(lastpath)
else:
messages.error(request, 'Ошибка в отправке запроса. Попробуйте позже.')
return HttpResponseRedirect(lastpath)
else:
messages.error(request, "Неверный формат номера телефона. Телефон нужно вводить в формате +99999999999")
args = {}
zzz = lastpath.render(RequestContext(request, args))
return HttpResponse(zzz)
回调url-
urlpatterns = [
url(r'^callback/', views.callback, name='send_callback'),
]
主页上的表单呈现:
<form class="get-info" action="/callback/callback/" method="post">
<input type="hidden" name="_subject" value="karpaty-perezvonite-mne">
<input id="callback" name="phone" type="tel" class="form-control" placeholder="+ 380 ___-__-__">
<input type="text" class="form-control" placeholder="" name="lastpath" value="/" style="display: none">
<button type="submit" class="btn btn-default" value="Send">Отправить</button>
</form>
如何修复它?您的中间件设置应该只包含
CsrfViewMiddleware
(请参阅)。CsrfResponseMiddleware
was和django.template.context_处理器。csrf
是django在使用render
时自动使用的模板上下文处理器。如果使用render
,则不需要args.update(csrf(request))
行。表单是否从回调
视图提交?请添加url模式。提交的表单来自哪个url?带CSRF标记的表单在模板中呈现得如何(在浏览器中单击“查看源代码”)。很难阅读注释中的代码-请回答原始问题。您还没有说明提交表单的URL。您正在尝试许多在现代Django中根本不需要的东西,如csrf(request)
和RequestContext
。如果在显示表单的视图中使用render
,则CSRF令牌应该可以正常工作。我编辑了我的问题。我可以看到表单正在提交到/callback/callback/
。您还没有说明表单是从哪个URL提交的。问题的第一个版本使用了返回render(…)
,这是正确的。带有lastpath.render()
的新版本没有意义。您的中间件设置应该只包含CsrfViewMiddleware
(请参阅)。CsrfResponseMiddleware
was和django.template.context_处理器。csrf
是django在使用render
时自动使用的模板上下文处理器。如果使用render
,则不需要args.update(csrf(request))
行。表单是否从回调
视图提交?请添加url模式。提交的表单来自哪个url?带CSRF标记的表单在模板中呈现得如何(在浏览器中单击“查看源代码”)。很难阅读注释中的代码-请回答原始问题。您还没有说明提交表单的URL。您正在尝试许多在现代Django中根本不需要的东西,如csrf(request)
和RequestContext
。如果在显示表单的视图中使用render
,则CSRF令牌应该可以正常工作。我编辑了我的问题。我可以看到表单正在提交到/callback/callback/
。您还没有说明表单是从哪个URL提交的。问题的第一个版本使用了返回render(…)
,这是正确的。带有lastpath.render()
的新版本没有意义。
urlpatterns = [
url(r'^callback/', views.callback, name='send_callback'),
]
<form class="get-info" action="/callback/callback/" method="post">
<input type="hidden" name="_subject" value="karpaty-perezvonite-mne">
<input id="callback" name="phone" type="tel" class="form-control" placeholder="+ 380 ___-__-__">
<input type="text" class="form-control" placeholder="" name="lastpath" value="/" style="display: none">
<button type="submit" class="btn btn-default" value="Send">Отправить</button>
</form>
UserWarning: A {% csrf_token %} was used in a template, but the context did not provide the value.
This is usually caused by not using RequestContext.