django 1.10 csrf_令牌未创建隐藏输入字段

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

我有一个表单,但是Django没有创建一个隐藏的输入,比如-

<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.