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. DiskLruCache详解 From GuoLin Blogs.

    作者:郭霖老师,<第一行代码>作者,开源框架LitePal作者 http://blog.csdn.net/guolin_blog/article/details/28863651 概述 记 ...

  2. apache-storm-1.0.3安装部署

      CentOS7-1 CentOS7-2 CentOS7-3 CentOS7-4 nimbus supervisor supervisor supervisor core(UI)       1.首 ...

  3. 使用python操作json文本文件

    使用python读写文本文件内容时,我们知道如果文本文件里的内容无规律,那么修改起来比较麻烦.但是如果文本文件存储是有规律的,比如JSON格式,在利用python内置的函数把JSON格式的数据转成py ...

  4. Hibernate错误:Could not bind factory to JNDI

    使用hibernate时,将hibernate.cfg.xml中 <session-factory name="SessionFactory">的那么属性去掉即可.因为 ...

  5. 安装pip环境以及pip常用命令使用

    1.去到Python的官网下载pip包,下载地址是:https://pypi.python.org/pypi/pip#downloads 2.下载完成之后,解压到一个文件夹,用CMD控制台进入解压目录 ...

  6. mysql 锁相关的视图(未整理)

    mysql 锁相关的视图 查看事务,以及事务对应的线程ID   如果发生堵塞.死锁等可以执行kill  线程ID  杀死线程      kill  199 SELECT * FROM informat ...

  7. android 带listview对话框

    package com.example.dialog2; import android.os.Bundle;import android.app.Activity;import android.app ...

  8. 将jar包发布到nexus仓库

    版本的快速迭代不适合release发布到仓库,snapshot方便版本的快速迭代. 1.pom改为snapshot <dependency> <groupId>com.sf.c ...

  9. [HZNUOJ] 使用Excel + Word 批量制作准考证

    一般程序设计考试或者ACM比赛都会使用临时账号登录,这时候就需要批量制作密码条 首先需要用Excel 存储队伍的信息 比如像这样分门别类的放好 然后在word 中制作好密码条样式 选择邮件->开 ...

  10. 理解android分辨率限定符 layout-sw360dp

    首先,我们来看看单位dp是怎么一回事,dp是一种单位,使用它,你可以在高.低分辨率上获得一样的空间表现,也就是说,它是像素无关的. dp计算公式:160*pix/ppi(pix是你要计算的高度或者宽度 ...