django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率。

最近遇到一个问题:

  当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据。

分析问题:

  由于form的POST 请求发出去后会刷新整个页面,自然无法保留上次输入的内容。

解决问题: 

  采用ajax的方式发出请求,避免刷新整个页面。

ajax是脑海里第一个冒出的想法,但经过了解form组件内部的更多参数以及原理,发现其实也可以在form发出

POST请求时保留上次输入的内容。这里面有个关键是: 可以使用form组件在前端页面中生成html标签。

下面贴下代码:

1.先在后台创建基于Form的类,在类中创建字段以此定义规则。

from django.forms import  Form,fields
class RegisterForm(Form):
user = fields.CharField(
min_length=6,
max_length=16,
error_messages={'min_length':'太短了','max_length':'太长了'},
label='用户名',
)
password = fields.CharField(
min_length=6,
max_length=16,
error_messages={'min_length':'太短了','max_length':'太长了'},
label='密码',
)
email = fields.EmailField(
label='邮箱',
)

2.前端页面代码

代码中obj是从后台传过来的,代表的是Form类的对象。在Django中,可以将obj传到前端。

通过obj点出类中的字段名称。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="POST" action="/register/" novalidate>
<p>
{{ obj.user.label }}{{ obj.user }} {{ obj.errors.user.0 }}
</p>
<p>
{{ obj.password.label }} {{ obj.password }} {{ obj.errors.password.0 }}
</p>
<p>
{{ obj.email.label }} {{ obj.email }} {{obj.errors.email.0 }}
</p>
<input type="submit"/>
</form>
</body>
</html>

3.后台逻辑代码

def register(request):
if request.method=='GET':
obj = RegisterForm() #当通过get请求来到注册页面时,没有携带数据,obj生成的html标签就自然没有values值
return render(request,'register.html',{'obj':obj})
else:
obj=RegisterForm(request.POST)#post请求发来了数据,此时obj中有values
v = obj.is_valid()#验证
if v:
print(obj.cleaned_data)#验证正确时在后台输出数据
return redirect('http://www.baidu.com')
else:
print(obj.errors) #错误信息
print(obj['user']) #obj其实打印出来是一串html形式的字符串 此句得到的结果是 <input type="text" name="user" maxlength="16" minlength="6" required id="id_user">
return render(request,'register.html',{'obj':obj})#传回前端的obj,包含数据

print(obj)后得出的结果

<tr><th><label for="id_user">用户名:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="user" maxlength="16" minlength="6" required id="id_user"></td></tr>
<tr><th><label for="id_password">密码:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="password" maxlength="16" minlength="6" required id="id_password"></td></tr>
<tr><th><label for="id_email">邮箱:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="email" name="email" required id="id_email"></td></tr>

django 使用form组件提交数据之form表单提交的更多相关文章

  1. 表单提交---前端页面模拟表单提交(form)

    有些时候我们的前端页面总没有<form></form>表单,但是具体的业务时,我们又必须用表单提交才能达到我们想要的结果,LZ最近做了一些关于导出的一些功能,需要调用浏览器默认 ...

  2. 前端表单提交数据~php获取表单内容

    上图代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  3. 【jquery采坑】Ajax配合form的submit提交(微擎表单提交,ajax验证,submit提交)

    1.采坑:实现form的submit提交,在提交之前,进行ajax的不同校验,然后onsubmit=return check(),进行提交 1/1 目的:可以实现以 from的submit提交,然后还 ...

  4. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  5. 使用jQuery.form插件,实现完美的表单异步提交

    传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...

  6. Html form 表单提交前验证

    可以使用form表单的onsubmit方法,在提交表单之前,对表单或者网页中的数据进行检验. onsubmit指定的方法返回true,则提交数据:返回false不提交数据. 直接看下面的代码: 1 & ...

  7. jquery.form.js(ajax表单提交)

    Form插件地址: 官方网站:http://malsup.com/jQuery/form/ 翻译地址:http://www.aqee.net/docs/jquery.form.plugin/jquer ...

  8. 浅谈 form 表单提交

    原创文章,转载请注明出处:http://www.cnblogs.com/weix-l/p/7675230.html 若有错误,请评论指出,谢谢! Form 对象代表一个 HTML 表单.在 HTML ...

  9. 使用axios模拟表单提交

    1.需求背景 最近在实验室写一个Spring前后端分离的项目,项目中使用Spring Security组件实现系统的认证和授权,当Security的认证模式设置为FormLogin时(如下代码),前端 ...

  10. jQuery异步表单提交

    有时在A页面点击按钮弹出一个form表单,在填完表单后提交成功后,需要关闭表单页并将表单中的某些值反应在A页面上,这时就需要异步提交表单.其实也挺简单,只是需要把表单数据序列化. $("#f ...

随机推荐

  1. web.xml中的元素

    error-page元素包含三个子元素error-code,exception-type和location.将错误代码(Error Code)或异常(Exception)的种类对应到web应用资源路径 ...

  2. index full scan和index fast full scan区别

    触发条件:只需要从索引中就可以取出所需要的结果集,此时就会走索引全扫描 Full Index Scan    按照数据的逻辑顺序读取数据块,会发生单块读事件, Fast Full Index Scan ...

  3. 等待事件对应的p1,p2,p3含义

    Oracle 10g v$session视图中不同等待事件对应的p1,p2,p3的含义也不同,我们不可能记住所有等待事件对应的p1,p2,p3的含义. 可以通过查询V$EVENT_NAME知道每个等待 ...

  4. luaIDE选择

    luaIDE选择 本人测试过各种luaIDE, 包括luaStudio, 不过我还是推荐eclipse+ldt的方式: http://zengrong.net/post/1951.htm 原因如下: ...

  5. XE6移动开发环境搭建之IOS篇(2):安装虚拟机(有图有真相)

    XE6移动开发环境搭建之IOS篇(2):安装虚拟机(有图有真相) 2014-08-15 22:04 网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的内容.傻瓜式的表 ...

  6. oracle 数据库误删数据,误删表的恢复

    1.某表的数据误删了,那么可以查询这个表某一时间节点之前的数据,并放到一个新建的表里. create table temptable as select * from t_billdefi  as O ...

  7. python中的引用传递,可变对象,不可变对象,list注意点

    python中的引用传递 首先必须理解的是,python中一切的传递都是引用(地址),无论是赋值还是函数调用,不存在值传递. 可变对象和不可变对象 python变量保存的是对象的引用,这个引用指向堆内 ...

  8. GZFramework错误(升级修改)日志

    sqlserver下事务中处理出现为初始化selectcommand的connection属性修改CommandDataBase中的PrepareCommand方法

  9. WeX5基础

    最近在研究微信app开发,使用的是WeX5,在这里把一些基础知识点记录下来,忘记了可以翻阅查看. 一:开发后端服务 1.建立数据源:窗口--首选项--studio配置--数据源--增加--数据源类型选 ...

  10. goquery常用语法

    Find 查找获取当前匹配的每个元素的后代Eq 选择第几个Attr 获取对应的标签属性AttrOr 获取对应的标签属性.这个可以设置第二个参数.获取的默认值 如果获取不到默认调用对应默认值Each 遍 ...