解决django中form表单设置action后无法回到原页面的问题


Posted in Python onMarch 13, 2020

django中form表单设置action后,点提交按钮是跳转到action页面的,比如设置action为login,网址为192.168.1.128,跳转后便会来到192.168.1.128/login,F5刷新也会是重新提交表单对话框,无法回到原页面。

因此就要在django服务器进行重定向,具体就是

from django.shortcuts import redirect
#最后返回原页面
return redirect(url)

补充知识:Django + Ajax发送POST表单,并将返回信息回显到页面中

将表单数据发送回后端,然后处理后端返回的信息并显示在当前页面中,这里使用Ajax进行处理;

那么先看js代码:

<!--以下为 Ajax脚本 -->
  <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  <script type="text/javascript">
  $(document).ready(function(){
   $("#save").click(function(){
   $.ajax({
     url:"/api/add_event/",    #url
     type: "POST",        #提交表单的类型,相当于method="post"
     dataType: "json",      #dataType, 这个是请求后,返回的数据将以json格式显示
     data:{"name": $("#id_name").val(),   #在"#"号后面是控件id, 所以千万不要搞错了,要不然会出大事的
        "limit":$("#id_limit").val(),
        "address": $("#id_address").val(),
        "start_time": $("#id_start_time").val(),
        "status": $("#id_status").val(),
     },                #Data这个地方,必须要获取数据,代表将获取到的数据发送到后端,后端再进行处理
     success:function(data){      
      console.log(data);      #调试使用
      console.log(data.status);   #调试使用
      console.log(data.message);   #调试使用
      $(".text").text(data.message); #将后端返回到结果通过前端页面进行展示

    },    #注意标点
   });     #需要注意标点符号,如果标点符合错误了,那ajax基本上都不会执行(否则,后果很严重哦)
   });     #注意标点
  });     #注意标点     
  </script>

注意(踩过的坑):

1.contentType: "application/json" ——>加入该语句时,在后端print(request.POST)时无法获取内容,相当于后端根本拿不到数据。因此在网上搜索了解到,使用contentType: “application/json”则data只能是json字符串;不使用时contentType一般为默认的application/x-www-form-urlencoded格式, 因此如果不限制 POST格式,干脆就不写。

2. 说说“data”这里面需要注意:data:{"name", $("#id_name").val(), } 这其中id_name必须为控件的id 名称,使用其它的则不能获取的数据,这个还是得注意。

3. 标注符号,标点符号,标点符号,重要的事情说三遍,当然可以借助专门的编辑器(我主要是懒哦,哈哈)

4. $(".text").text(data.message); 回显在html中,是对后端返回的数据进行处理

那行回显在网页面上面

<font color="red"> 
<span class="text"></span> 
</font>

以下为html代码

<div class="container">
  <div class="col-md-4 col-md-offset-4">
    <form id="form1" onsubmit="return false" action="##" method="POST" class="form-horizontal">

    <!--此处就是通过后端返回到前端,前端进行展示-->
      <font color="red">
        <span class="text"></span>
      </font>

      <div class="form-group">
        <label for="id_name">发布会名称:</label>
        <input type="text" name="name" class="form-control" placeholder="发布会名称" maxlength="128" required id="id_name" />
      </div>
      <div class="form-group">
        <label for="id_limit">Limit:</label>
        <input type="number" name="limit" class="form-control" required id="id_limit" />
      </div>
      <div class="form-group">
        <label for="id_address">发布会地址:</label>
        <input type="text" name="address" class="form-control" placeholder="地址" maxlength="128" required id="id_address" />
      </div>
      <div class="form-group">
        <label for="id_start_time">开始日期:</label>
        <input type="text" name="start_time" required id="id_start_time" />
      </div>

      <div class="form-group">
        <label for="id_status">发布状态:</label>
        <select name="status" id="id_status">
         <option value="blank">-----</option>
         <option value="1">True</option>
         <option value="0">False</option>
        </select>
      </div>

      <div align="center">
       <input class="btn btn-lg btn-primary" id="save" type="submit" value="保存发布会" ></input >
      </div>
    </form>
  </div>
</div>

现在来看一下后端的代码:

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def add_event(request):
  if request.is_ajax():
    print(request.body)
    print(request.POST)

    name = request.POST.get('name', '') # 发布会名称
    limit = request.POST.get('limit', '') # 限制人员
    status = request.POST.get('status', '') # 发布会状态
    address = request.POST.get('address', '') # 发布会地址
    start_time = request.POST.get('start_time', '') # 发布会时间

    if name == '' or limit == '' or status == '' or start_time == '':
      return JsonResponse({'status': 10021, 'message': 'parameter error'})

    # 判断发布会名称重复
    result = Event.objects.filter(name=name)
    if result:
      return JsonResponse({'status': 10023, 'message': 'event name already exists'})

    if status == '':
      status = 1

    try:
      # Event.objects.create(id = eid, name = name, limit = limit, address = address, status = int(status), start_time=start_time)
      Event.objects.create(name=name, limit=limit, address=address, status=int(status), start_time=start_time)
    except ValidationError as e:
      error = 'start_time format error. It must be in YYYY-MM-DD HH:MM:SS'
      return JsonResponse({'status': 10024, 'message': error})
    return JsonResponse({'status': 200, 'message': 'add event success'})

1、在后端处理时,我们需要加入:@csrf_exempt 标记,所以导包from django.views.decorators.csrf import csrf_exempt,否则会出现错误csrf_token错误 (403)

2、request.is_ajax()判断当前是否是使用ajax 进行表单提交

3、django request.POST / request.body

当request.POST没有值 需要考虑:

1.请求头中的: Content-Type: application/x-www-form-urlencoded request.POST中才会有值(才会去request.body中解析数据),关于Content-Type前面也提到,不写的错误,它就是默认。

request.body的请求数据

b'name=%E5%A4%BA%E5%A4%BA&limit=123‘

request.POST的数据,django已进行自动处理

QueryDict: {‘name': [‘夺夺'], ‘limit': [‘123']

以上这篇解决django中form表单设置action后无法回到原页面的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现bitmap数据结构详解
Feb 17 Python
在Python中用get()方法获取字典键值的教程
May 21 Python
python基础之入门必看操作
Jul 26 Python
Python正则表达式知识汇总
Sep 22 Python
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
python 的 openpyxl模块 读取 Excel文件的方法
Sep 09 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 Python
Python3实现打印任意宽度的菱形代码
Apr 12 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 Python
浅析PyCharm 的初始设置(知道)
Oct 12 Python
python编写扎金花小程序的实例代码
Feb 23 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 #Python
在Django中预防CSRF攻击的操作
Mar 13 #Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 #Python
Pycharm中切换pytorch的环境和配置的教程详解
Mar 13 #Python
django 取消csrf限制的实例
Mar 13 #Python
django-csrf使用和禁用方式
Mar 13 #Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
Mar 13 #Python
You might like
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
微信小程序request出现400的问题解决办法
2017/05/23 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
Vue 实现树形视图数据功能
2018/05/07 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
python中redis的安装和使用
2016/12/04 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python爬取指定微信公众号文章
2018/12/20 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
加拿大租车网站:Enterprise Rent-A-Car
2018/07/26 全球购物
学生档案自我鉴定
2013/10/07 职场文书
单位人事专员介绍信
2014/01/11 职场文书
安全生产目标责任书
2014/04/14 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
Python OpenGL基本配置方式
2022/05/20 Python