解决django中form表单设置action后无法回到原页面的问题
作者:攻城狮的策划 发布时间:2023-06-27 00:27:54
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']
来源:https://blog.csdn.net/m0_37566460/article/details/62047803
猜你喜欢
- 本文实例讲述了Python删除windows垃圾文件的方法。分享给大家供大家参考。具体如下:#coding:utf-8import os#f
- 熟悉pandas的pythoner 应该知道给dataframe增加一列很容易,直接以字典形式指定就好了,pyspark中就不同了,摸索了一
- 物体跟踪效果展示 过程:一、初始化def Motor_Init(): global L_Motor, R
- 在印刷排版中“point”是一个绝对的单位,它等于 1/72 英寸。可以用尺子丈量的,物理的英寸。但在CSS中pt的含义
- golang 字符串 int uint int64 uint64 互转字符串 转 intintNum, _ = strconv.Atoi(i
- 一、BN(Batch Normalization)算法1. 对数据进行归一化处理的重要性神经网络学习过程的本质就是学习数据分布,在训练数据与
- 工作中遇到一个问题,两个字符串匹配,要求:每个字符串中最多含有一个*,?可以无限多个*代表一个任意长度的字符串,而?则代表一个字符要求可以提
- xhEditor简介xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化HTML编辑器,基于网络访问并且兼容IE 6.0+,
- 本文实例为大家分享了PHP变量传值赋值和引用赋值变量销毁的具体代码,供大家参考,具体内容如下<?php $a = 100
- 很多人可能认为门户网站首页设计只是把一些导航、资讯内容和广告堆积起来摆放得好看就可以了,虽然这个观点也并不是完全错误的,确实门户网站首页是由
- request获取post请求中的json数据def hello(request): data = json.loads(request.b
- 介绍PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、
- 本文实例为大家分享了python实现网页自动签到功能的具体代码,供大家参考,具体内容如下第1步、环境准备(用的chrome浏览器)1.安装s
- ……最近在学习yolo1、yolo2和yolo3,事实上它们和SSD网络有一定的相似性,我准备汇
- 引言本文想要解决的问题是当DataFrame中某一列元素为不定长度的数组时,该如何对它们进行拆分分解为后续元素,从而进行进一步的提取操作,数
- 过程名:catch(str) 使用方法: 代码如下:on error resume next '你的代码,如数据库连接 call c
- Python 中的 timeit 模块可以用来测试一段代码的执行耗时,如一个变量赋值语句的执行时间,一个函数的运行时间等。timeit 模块
- 实例如下所示:import osos.chdir("G:\Python1\Lib\site-packages\pytesser&q
- 练手项目,先上图先实现一个简单的串口工具,为之后的上位机做准备代码如下:github 下载地址pyserial_demo.pyimport
- 一、前言我们经常谈论的缓存一词,更多的类似于将硬盘中的数据存放到内存中以至于提高读取速度,比如常说的redis,就经常用来做数据的缓存。Py