Django—Form两种保留用户提交数据的方法

用户在网页上进行表单填写时,有可能出现某项填写错误。一般情况下,用户在未发觉错误的情况下点击提交,则此表单的内容会清空,用户不得不再重新填写,这样的用户体验是及其糟糕的。

在此,我们有2种方法将用户的输入保存下来,一旦填写错误,只需要将错误项修改即可重新提交。

一、利用Form生成Html标签

1. views.py

 1 from django.shortcuts import render, HttpResponse, redirect
 2 from django.forms import Form, fields, widgets
 3
 4
 5 #Form验证
 6 class TestForm(Form):
 7     inp1 = fields.CharField(min_length=4, max_length=8)
 8     inp2 = fields.EmailField()
 9     inp3 = fields.IntegerField(min_value=10, max_value=100)
10
11
12 #测试函数
13 def test(request):
14     if request.method == ‘GET‘:
15         obj = TestForm()
16         return render(request, ‘test.html‘, {‘obj‘: obj})
17     else:
18         obj = TestForm(request.POST)
19         if obj.is_valid():
20             return HttpResponse(‘提交成功‘)
21         return render(request, ‘test.html‘, {‘obj‘: obj})

2. test.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <form action="/test/" method="post" novalidate>
 9     {% csrf_token %}
10     <p>输入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}</p>
11     <p>输入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}</p>
12     <p>输入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}</p>
13     <input type="submit" value="提交">
14 </form>
15 </body>
16 </html>
novalidate屏蔽浏览器提供的表单验证功能

说明:

若用户输入不符合自定义的Form规则,则会返回obj = TestForm(request.POST),重新渲染test.html,而此时,obj中包含了上次用户输入的所有内容。

效果:

提交之后出现错误提示,但用户输入的数据依然存在

二、利用Ajax提交数据不刷新页面

Ajax提交数据虽然不刷新网页,但是无法完成用户输入验证,还须借助Form返回给其验证信息

1. views.py

 1 from django.shortcuts import render, HttpResponse, redirect
 2 from django.forms import Form, fields, widgets
 3 import json
 4
 5 #Form验证
 6 class TestForm(Form):
 7     inp1 = fields.CharField(min_length=4, max_length=8)
 8     inp2 = fields.EmailField()
 9     inp3 = fields.IntegerField(min_value=10, max_value=100)
10
11
12 def test(request):
13     return render(request, ‘test.html‘)
14
15
16 def ajax_test(request):
17     ret = {‘status‘: True, ‘msg‘: None}
18     obj = TestForm(request.POST)
19     if obj.is_valid():
20         v = json.dumps(ret)
21         return HttpResponse(v)
22     else:
23         ret[‘status‘] = False
24         ret[‘msg‘] = obj.errors
25         v = json.dumps(ret)
26         return HttpResponse(v)

2. test.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <form id="f1">
 9     {% csrf_token %}
10     <p>输入1 <input type="text" name="inp1"></p>
11     <p>输入2 <input type="text" name="inp2"></p>
12     <p>输入3 <input type="text" name="inp3"></p>
13     <input type="button" onclick="ajax_submit();" value="提交">
14 </form>
15 </body>
16 <script    src="/static/jquery-3.2.1.js"></script>
17 <script>
18     function ajax_submit() {
19 {#            删除上次错误提示#}
20         $(".c1").remove();
21         $.ajax({
22             url: ‘/ajax_test/‘,
23                     type: ‘POST‘,
24                     data: $("#f1").serialize(),
25                     dataType: ‘JSON‘,
26                     success: function (args) {
27                             if(args.status){
28                                 location.href="http://www.163.com";
29                             }else{
30                                 $.each(args.msg, function (index,value) {
31                                             console.log(index,value);
32                                             var tag=document.createElement(‘span‘);
33                                             tag.className=‘c1‘;
34                                             tag.innerHTML=value[0];
35                                             $("#f1").find(‘input[name="‘+index+‘"]‘).after(tag);
36                   })
37                             }
38           }
39             })
40   }
41 </script>
42 </html>

说明:

若用户输入不符合Form规则,ajax获取错误信息,并动态添加错误信息至span标签,提示用户

效果:

时间: 2024-08-02 11:03:31

Django—Form两种保留用户提交数据的方法的相关文章

【Django】Django—Form两种解决表单数据无法动态刷新的方法

一.无法动态更新数据的实例 1. 如下,数据库中创建了班级表和教师表,两张表的对应关系为"多对多" 1 from django.db import models 2 3 4 class Classes(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class Teacher(models.Model): 9 name = models.CharField(max_length=32) 10 t2c = mo

jQuery使用serialize(),serializeArray()方法取得表单数据+字符串和对象类型两种表单提交的方法

原始form表单值获取方式(手动): $.ajax({ type: "POST", url: "ajax.php", data: "Name=摘取天上星&position=IT技术", success: function(msg){alert(msg);}, error: function(error){alert(error);} }); JQ serialize()方法取值: $.ajax({ type: "POST&quo

jQuery跨域请求,跨域Post提交数据的方法(.net/SQL技术交流群206656202 入群需注明博客园) - 思...

jQuery跨域请求,跨域Post提交数据的方法(.net/SQL技术交流群206656202 入群需注明博客园) - 思... 无聊透顶,网上看看技术文章吸收下精华,无意中发现很多开发人员在跨域请求方面很是疑惑,本人整理了一下曾经写过的代码供苦苦寻找解决方案的IT人一点灵感,如果认为自己是高手呢那么您就可以潇洒的飘过了~~废话不说了免得招人烦~~ 一.get方式实现跨域请求 这里我使用jQuery.getJSON()函数实现      a站点 http://bj.xxxx.com.aspx 请

聊聊JVM(三)两种计算Java对象大小的方法

这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐),按照8的倍数对齐 数组对象结构是 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对

ASP模拟POST请求异步提交数据的方法

这篇文章主要介绍了ASP模拟POST请求异步提交数据的方法,本文使用MSXML2.SERVERXMLHTTP.3.0实现POST请求,需要的朋友可以参考下 有时需要获取远程网站的某些信息,而服务器又限制了GET方式,只能通过POST数据提交,这个时候我们可以通过asp来实现模拟提交post数据,网上有挺多这样的例子的.下面的是我自己写的比较简洁易懂的函数. 首先,需要一个编码设置的函数,因为asp一般为gbk的,而标准的网站现在大都使用utf-8的.所以需要转换. 代码如下: function

vue el-form鼠标事件导致页面刷新解决方案;vue 阻止多次点击提交数据通用方法

一.阻止表单自动提交刷新页面:<el-form> <el-form-item :inline="true" @submit.native.prevent> <el-input @keyup.enter.native='submit'></el-input> </el-form-item> </el-form> 注意: 鼠标事件导致页面刷新问题,在el-form上增加 @submit.native.prevent 可

bootstrap table两种分页需要的数据不同

先上原帖地址:http://blog.csdn.net/tyrant_800/article/details/50269723 问题描述: 调用$("#show_list_table").bootstrapTable("refresh");刷新table以后,搜索条件可以传入,也请求到了数据,但是就是不在table中展示数据. 最后发现是因为服务器端分页和客户端分页需要的json格式不一样. 原帖内容: 服务器分页/客户端分页的转换,table刷新 bootstra

nginx的两种配置用户权限访问

linux中生成密码文件的命令一般有两种 opensslpasswd -crypt passwd之后会生成一个字符串,文件不需要 另一种是 htpasswd -c /etc/filename.db  username 这时候会显示用户名输入密码: 当系统显示没有htpasswd命令的时候可以在输入htpasswd后系统显示安装的软件(ubuntu) 最后贴出我自己的nginx的配置作为参考: server { listen       9200; server_name   xxxxxxxx;

用户画像数据建模方法

作者:百分点技术总监郭志金 摘自:百分点(ID: baifendian_com) 从1991年Tim Berners-Lee发明了万维网(World Wide Web)开始,到20年后2011年,互联网真正走向了一个新的里程碑,进入了“大数据时代”.经历了12.13两年热炒之后,人们逐渐冷静下来,更加聚焦于如何利用大数据挖掘潜在的商业价值,如何在企业中实实在在的应用大数据技术.伴随着大数据应用的讨论.创新,个性化技术成为了一个重要落地点.相比传统的线下会员管理.问卷调查.购物篮分析,大数据第一次