【问题标题】:CSRF verification failed. Request aborted,Django Post RequestCSRF 验证失败。请求中止,Django Post 请求
【发布时间】:2015-10-13 13:17:06
【问题描述】:

在 django 1.8 中更新数据库记录时出错

Forbidden (403)
CSRF verification failed. Request aborted.

我的网址:

url(r'^blog/update/(?P<id>[0-9]+)/$','news.views.update')

def edit(request,id):
    blogs = Blog.objects.get(pk=id)

    return render_to_response('news/edit.html',{'blogs':blogs})

def update(request,id):
    if request.method=='POST':
        blog = Blog.objects.get(pk=id)
        blog.title = request.POST.get('title')
        blog.content = request.POST.get('content')
        blog.save()
        return HttpResponse('updated successfully!!')
    else:
        return HttpResponse('error')

新闻/edit.html

<form action="/blog/update/{{blogs.id}}/" method="POST">{%csrf_token%}
    <label>Title:</label>
    <input type="text" name="title" value="{{blogs.title}}"><br>
    <label>Content:</label>
    <textarea cols="45" rows="4" name="content">{{blogs.content}}</textarea><br>
    <input type="submit" value="submit">

</form>

【问题讨论】:

  • 你的中间件中有'django.middleware.csrf.CsrfViewMiddleware'吗?

标签: python django


【解决方案1】:

您需要将 csrf 中间件添加到您的 settings.py 文件中:

MIDDLEWARE_CLASSES = (
...
'django.middleware.csrf.CsrfViewMiddleware',
)

还有,改变

return render_to_response('news/edit.html',{'blogs':blogs})

return render(request, 'news/edit.html', {'blogs': blogs})

return render_to_response('news/edit.html', {'blogs': blogs}, context_instance=RequestContext(request))

这是因为您需要为每个请求添加上下文。

Similar answer here

【讨论】:

  • 可能没有正确包含上下文...尝试将 return render_to_response('news/edit.html',{'blogs':blogs}) 更改为 return render(request, 'news/edit.html', {'blogs': blogs})
猜你喜欢
  • 2012-12-07
  • 2015-03-08
  • 2014-02-03
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多