django1.11如何用post方法提交表单

django为了帮助应对跨站脚本攻击,在以POST方法提交表单时,要求将其内置的CSRF中间件添加到setting.py的中间件设置中(django.middleware.csrf.CsrfViewMiddleware,默认已添加),并且在<form>标签后添加{% csrf_token %},即表单元素变为:

<form action="" method="post">{% csrf_token %}

同时,表单提交对应的视图函数也要调用RequestContext生成context实例,用于生成响应。这样才能顺利提交表单。

根据官方文档内容(https://docs.djangoproject.com/en/1.11/ref/csrf/),如果使用render()快捷方法、generic view或contrib,那就不用特意设置RequestContext,因为它们默认已经在使用RequestContext了。因此,提交表单的视图函数可以这样写

from django.shortcuts import render

def receiving_data(req):
    if req.method == ‘POST‘:
        #your code

        ctx = {‘key‘: ‘foo‘}

        return render(req, ‘site/xx.html‘, ctx)    

后来又看了官方文档后(https://docs.djangoproject.com/en/1.11/ref/templates/api/#django.template.RequestContext)联想能不能用 t = loader.get_template(‘foo.html‘) 的形式加载template,用RequestContext生成context实例,再用 return HttpResponse(t.render(context)) 生成响应。

经过测试后,发现不行,错误为“context must be a dict rather than RequestContext.”。

根据官方文档(https://docs.djangoproject.com/en/1.11/topics/templates/#django.template.loader.get_template)
可知Template.render(context=None, request=None)这个函数中,context必须是一个dict。而我们之前提供的RequestContext并不是dict,自然就无法使用RequestContext的实例作为Template.render()的context的值了。

后来又查到django1.11的更新日志,对loader.get_template()又有一些说明,内容如下:
(https://docs.djangoproject.com/en/dev/releases/1.11)
For compatibility with multiple template engines, django.template.backends.django.Template.render() (returned from high-level template loader APIs such as loader.get_template()) must receive a dictionary of context rather than Context or RequestContext. If you were passing either of the two classes, pass a dictionary instead – doing so is backwards-compatible with older versions of Django.

原来在1.11版中,loader.get_template()不再支持以Context 或RequestContext.实例作为context参数的值。

PS:官方文档这一段
(https://docs.djangoproject.com/en/1.11/ref/templates/api/#django.template.RequestContext)中,

可以发现django.template.Template的实例依然可以用django.template.Context的实例作为context参数,具体还有待研究。

时间: 2024-10-07 13:18:49

django1.11如何用post方法提交表单的相关文章

jquery中$.ajax方法提交表单

function postdata(){                        //提交数据函数 $.ajax({                                //调用jquery的ajax方法 type: "POST",                       //设置ajax方法提交数据的形式 url: "ok.php",                      //把数据提交到ok.php data: "writer=

GET/POST 方法提交表单

下面一段地址 bing_search_rstudio_url = "http://cn.bing.com/search?q=rstudio&qs=AS&pq=rst&sc=8-3&sp=1&cvid=61252d92243847ca8025403c36db6f1c&FORM=QBLH" 表单参数提取(与浏览器客户端相关) names(getFormParams(bing_search_studio_url)) [1] "q&qu

multipart/form-data post 方法提交表单,后台获取不到数据

这个和servlet容器有关系,比如tomcat等. 1.get方式 get方式提交的话,表单项都保存在http header中,格式是 http://localhost:8080/hello.do?name1=value1&name2=value2这样的字符串.server端通过request.getParameter是可以取到值的. 2.post方式(enctype为缺省的application/x-www-form-urlencoded) 表单数据都保存在http的正文部分,格式类似于下面

php中提交表单数据的POST()方法和GET()方法

提交获取表单数据是表单应用中最常用的操作,经常需要PHP后台从前台页面中获取用户在前台表单页面中提交的各种数据.表单数据传递的方式有以下的两种方法,一种为POST()方法,另外一种为GET()方法.具体采用哪种获取数据的方法是由<form>表单的 method 属性所指定的,下面讲解这两种方法在 Web 表单中的具体应用.大理石平台厂家 使用POST()方法提交表单 在使用POST()方法时,只需要将<form>表单中的属性 method 设置成POST即可. POST()方法不依

Java+MyEclipse+Tomcat (四)Servlet提交表单和数据库操作

前面三篇文章讲述了如何配置MyEclipse和Tomcat开发JSP网站.如何配置Servlet简单实现表单提交.如何配置MySQL实现JSP数据库查询. 这篇文章主要讲述Servlet表单的提交.Java中实现数据库的查询操作和自己遇到的瓶颈及理解.Java Web基础性文章,希望对大家有所帮助~ Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门 Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交 Java+MyEclipse+

Laravel用post提交表单常见的两个错误

最近在自学Laravel,测试用post方法提交表单时碰到两个错误: 1.获取传入的值时,报错如下图所示: 在stackFlow找答案时各种解释都有,但认真读一下报错信息,意思大概是:获取Http传入值方式不允许,检查代码,将偷懒写的: 1 Route::get('test',function(){ 2 // 3 }); 改为用post方法或者any方法接收即可: 1 Route::post('test',function(){ 2 // 3 }); 2.提交表单时,第二个报错信息如下图所示:

表单提交(三)——阻止Eneter键提交表单

当用户在文本框中进行编辑时,按下键盘Enter键,会触发表单提交.为了防止这种意外,有一种方法就是拒绝所有表单提交, 然后通过单击指定的提交命令按钮才能提交表单. 首先,将"return false"绑定到表单的onsubmit事件,来阻止所有表单提交. 第二,使用input="button"通过onclick事件,以this.form.submit()方法提交,而不会触发onsubmit事件. 所以不能使用jquery方式$("#myForm"

在jsp提交表单的参数封装到一个方法里

建议去看一下孤傲苍狼写的Servlet+JSP+JavaBean开发模式(http://www.cnblogs.com/xdp-gacl/p/3902537.html), 最好把他JavaWeb学习总结全部看完会有很大的收获哦! 而把jsp专递的参数封装到一个方法里面也是从他那里学到的. 我觉得特别有用,尤其是在做项目的时候能省很多的代码  一: 需要的包 根据上一篇JDBC+Servlet+jsp(http://www.cnblogs.com/zhu520/p/6913650.html)的内容

利用JS提交表单的几种方法和验证(必看篇)

第一种方式:表单提交,在form标签中增加onsubmit事件来判断表单提交是否成功 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <script type="text/javascript">    function validate(obj) {     if (confirm("提交表单?")) {       alert(obj.value);       return true;     }