【问题标题】:updating django project: changing html form method from GET to POST更新 django 项目:将 html 表单方法从 GET 更改为 POST
【发布时间】:2012-08-23 12:47:28
【问题描述】:

我是 django 的新手,并制作了一个方法:GET 带有复选框/文本框和提交按钮的表单。我想将其更改为方法:POST 表单,但不断收到错误消息:

失败原因:

CSRF 令牌丢失或不正确。

一般来说,当存在真正的跨站请求伪造时,或者没有正确使用 Django 的 CSRF 机制时,就会发生这种情况。对于 POST 表单,您需要确保:

您的浏览器正在接受 cookie。

视图函数使用 RequestContext 作为模板,而不是 Context。

在模板中,每个 POST 表单内都有一个 {% csrf_token %} 模板标签,以内部 URL 为目标。

如果您不使用 CsrfViewMiddleware,那么您必须在任何使用 csrf_token 模板标签的视图以及接受 POST 数据的视图上使用 csrf_protect。

我试图更改调试器所说的所有内容,但我不断收到相同的错误。我想知道除了views.py、模板文件(.html)和settings.py文件之外是否还有其他需要更改的文件:

views.py:

from django.template import RequestContext, loader
from crunchApp.models import Filter
from django.http import HttpResponse
from django.core.context_processors import csrf
from django.shortcuts import render_to_response, get_object_or_404
from django.http import Http404    

def results(request):

    c = {}
    c.update(csrf(request))
    return render_to_response('crunchApp/results.html', c)

模板/test.html

    <form name="myform" action="results" method = "post" >{% csrf_token %}
        <fieldset>
            <input type="checkbox" value="total_money" id = "money_check" name="check" /> Filter by Total Money</br>
    </fieldset></form>

settings.py

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)

【问题讨论】:

    标签: html django forms post


    【解决方案1】:

    你不需要

    c = {}
    c.update(csrf(request))
    

    但您确实需要 context_instance=RequestContext(request),如

    render_to_response(<template>, <vars>, context_instance=RequestContext(request))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2022-01-20
      • 2012-01-13
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多