一,创建一个表单
创建一个Form表单有两种方式:
第一种方式是继承于forms.Form,的一个子类,通过在form中选择你需要的类型来规定表单之
中字段的类型

class LoginForm(forms.Form):username = forms.CharField(max_length=15,min_length=5,#onblur = "Check(this)",error_messages={'required': u'不能为空','min_length':u'最少为5个字符','max_length':u'最多为20个字符',},widget=forms.TextInput(attrs={'class':"form-control",'placeholder':u'5-20个字符','onblur' : "Check(this)",}))password = forms.CharField(widget=forms.PasswordInput,max_length=20,min_length=6,error_messages={'required': u'不能为空','min_length':u'最少为6个字符','max_length':u'最多为20个字符',})

其中 django 内置了很多的字段,让开发者可以直接使用,并且内置了这些字段的检验使站点中的表单数据检测变得方便,也提供了一些可选择的检验规则如required=False等,具体的可以去Django 官网查询API。

第二种 是直接利用数据库中以有的表来生成表单项, 这对于一个管理系统类型的网站 比较有用,因为如果一个站点有大量的实体数据需要让用户输入,那么就不必重新花费时间来定义表单,只需要直接的和 model 进行关联就可以了如:

from web_models import modelsclass LoginForm(forms.ModelForm):class Meta:model = models.AdminInfo#直接通过数据的表生成表单。直接关联到了数据库的列名fields = ('username', 'password')#只从AdminInfo表中拿这两个字段,用来生成表单#通过widgets这个参数,手动的设定字段以何种input类型显示widgets = {'username': forms.TextInput(attrs={'class': "form-control", 'placeholder': "用户名"}),'password': forms.PasswordInput(attrs={'class': "form-control",'placeholder': "密码"}),}
    class Meta:model = models.AdminInfoexclude = ('user_info',)#exclude 属性用来固定哪些字段不想生成到表单中

fields和exclude 两个字段用一个就行

二、使用表单

在视图中使用

在视图中使用一个表单的两种功能,一是创建一个表单让用户来填写信息;另一个是处理表单中的数据。

创建一个表单就是直接实例化一个表单对象:

formx = LoginForm()

form = ContactForm(),里面有几个比较重要的参数:auto_id=False这个参数 主要是表示 是否在表单中生成 id ,因为有的时候你不想让你每个表单的字段都对应一个id, 如果生成 默认id是 id_form字段名字.

设置默认值
可以在创建 表单对象时传入如下参数initial={}
这是一个字典参数,对应每个字段的默认值, 可以在定义表的时候在没定义一个时段 中添加 initial='http://' 来设定默认值
更新数据
你可能需要 用一个 model实例来初始化他,这样就可以达到表单更新数据
f = ArticleForm(instance=a) 其中 a 是article 的一个model实例。

提取数据

在 处理 post 请求时候, 通过 f = ArticleForm(request.POST)来获取一个填有用户数据的form
在调用了 is_valid 方法以后 就可以通过 f.cleaned_data ,返回一个 装有数据的字典

三、关于django form表单的其他说明

1)form类的运行顺序是init,clean,validte,save

其中clean和validate会在form.is_valid()方法中被先后调用。

下面为在views中处理表单

def login(request):error = ''login_form = LoginForm(request.POST)if request.method == 'POST':check = request.POST.get('checkcode',None)if check != request.session['CheckCode'].lower():error = '验证码错误.'else:if not login_form.is_valid():# 数据验证error = '用户名或密码格式错误.'else:data = login_form.clean()#放到login_from对象的字典里,数据的获取result = account_manager.check_valid(**data)if result.status:ret = {'id': result.data.user_info.id, 'name': result.data.user_info.name}request.session['auth_user'] = json.dumps(ret)target = request.GET.get('back', '/home/index/')return redirect(target)else:error = '用户名或密码错误.'return render_to_response('account/login.html', {'model': login_form,'error': error})

2)clean方法返回值

如果字段定义charfield,那么clean方法返回的cleaned_data中对应的字段值就是字符型,

定义为ModelMultipleChoiceField,则cleaned_data中字段值是个model实例list。

3)上面案例中的应用

ModelForm的Meta类中定义的fields:默认的Field是Model中定义的Field,如需更改,可在Form类内以同名字段覆盖,如上图第二段代码中;

不管字段在form中怎么自定义,cleaned_data中对应的值都必须按照model中定义的字段类型取值。

四、前台login.html代码,只有HTML部分。作为一个参考,样式没有附带

<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title></title><link rel="stylesheet"  href="/static/plugins/bootstrap/css/bootstrap.min.css"/><link rel="stylesheet"  href="/static/plugins/font-awesome/css/font-awesome.min.css"/><link rel="stylesheet"  href="/static/css/commons.css"/><link rel="stylesheet"  href="/static/css/account.css"/>
</head>
<body><div class="login-container"><div class="account-body clearfix"><div class="logo left"><img style='height:100%;width: 100%;' src="/static/p_w_picpaths/login.png" /></div><div class="form left"><div style="margin: 10px 60px 0 60px;"><form id="Form" method="POST">{% if error %}<div class="alert alert-danger" role="alert"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span><span class="sr-only">Error:</span>{{ error }}</div>{% else %}<div style="height: 30px;">&nbsp;</div>{% endif %}<div class="input-group"><span class="input-group-addon"><i class="fa fa-user"></i></span>{{ model.username }}</div><div class="input-group"><span class="input-group-addon"><i class="fa fa-lock"></i></span>{{ model.password }}</div><div class="input-group"><span class="input-group-addon"><i class="fa fa-pencil-square-o"></i></span><input type="text" name="checkcode" class="form-control check-code" placeholder="验证码"><img οnclick='ChangeCode();' id='imgCode' src="/account/checkcode/"></div><div class="input-group"><span  class="check"><input type="checkbox" ></span><span>自动登录</span><span style="margin-left: 50px"><a href="#">忘记密码</a></span></div><div class="input-group"><input type="submit" class="btn btn-primary" value="登 陆" /><input type="reset" class="btn btn-primary" value="重 置" /></div></form></div></div></div></div><script src='/static/js/jquery-1.8.2.min.js'></script><script src='/static/js/valid.js'></script><script type="text/javascript">$(function(){$.login('#Form','');})function ChangeCode() {var code = document.getElementById('imgCode');code.src += '?';}function(form,summaryStatusId){$(form).find(':submit').click(function(){var flag = true;$(form).find(':text,:password').each(function(){var name = $(this).attr('name');var label = $(this).attr('placeholder');var val = $(this).val();var $parent = $(this).parent();if(!val || val.trim() == ''){flag = false;ErrorMessage($parent,label+'不能为空.');return false;}EmptyError($parent);});return flag;});
}
</script>
</body>
</html>

ps:本文为一个django 使用forms 登入的前台案例,还未完善

ps:上面所用代码 大多来自 django book  和 django官网API ,更多的问题请留言

转载于:https://blog.51cto.com/xiaofangliu/1693827

django03_表单(forms.ModelForm)(login前后台)相关推荐

  1. Laravel教程 六:表单 Forms

    Laravel教程 六:表单 Forms 此文章为原创文章,未经同意,禁止转载. Form laravel 5.2 之后请使用 laravelcollective/html 替换 illuminate ...

  2. python django 表单_Django ModelForm与Form

    django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form 基于dj ...

  3. Django表单之ModelForm实践

    最近在学习Django框架,然后准备结合一些业务做一些web应用来处理工作中的问题.目前正好赶上了天津的疫情隔离,所以抓紧这些难得时间,学习一些东西来提升自己. 本篇主要的知识点: 使用ModelFo ...

  4. RaSa2.5.x行为之四:表单(Forms)

    目录 Usage 定义Form(Defining a Form) 激活Form(Activating a Form) 停用Form(Deactivating a Form) Slot Mappings ...

  5. html中用form单选框右侧提示汗字,HTML表单(Forms)解析

    HTML表单(Form)是HTML的一个重要部分,主要用于采集和提交用户输入的信息. 举个简单的例子,一个让用户输入姓名的HTML表单(Form).示例代码如下: 请输入你的姓名: 01. 02. 输 ...

  6. Pyhon Django 表单类ModelForm注册案例(可直接操作数据库)

  7. 用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 修改 User Model Flask Bcrypt 将 Bcrypt ...

  8. 添加form表单_Django实战:如何使用djangocrispyforms美化Bootstrap 4表单

    这是一个快速教程,可帮助您开始使用django-crispy-forms, 并且永不回头.Django-crispy-forms是一个很棒的第三方包,可让您控制渲染Django表单的方式,而不会破坏默 ...

  9. Django基础(11): 表单集合Formset的高级用法详解

    Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据,比如一个页面上添加多个用户信息.今天小编我就介绍下Djang ...

最新文章

  1. Script:收集UNDO诊断信息
  2. 编写和调试Shader程序(1)
  3. 转录组背景、环境设置(目录管理)
  4. 【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )
  5. 红盟php 解密,php教程_神盾加密解密教程(一)PHP变量可用字符
  6. 大数据如何预测上市公司的业绩?
  7. LINUX ltrace命令-用来跟踪进程调用库函数的情况学习
  8. hoj 2739 中国邮局问题
  9. linux errno定义
  10. 这就是搜索引擎--读书笔记五--索引的建立与更新
  11. 小球(信息学奥赛一本通-T1363)
  12. linux简单好玩的命令,有趣的Linux命令行玩法 cal
  13. [转]国外英语教学网页
  14. 创建微信订阅号全攻略
  15. office2016专业增强版cmd安装
  16. 我的大三一年职业规划,预期毕业目标
  17. Android自定义View实现三角到八角的属性分布图-雷达图(蜘蛛网图)
  18. 通用贷款计算器js 计算方法
  19. 给在线发布的cab文件进行数字签证
  20. Aspose最版本aspose-words:jdk17:23.4 版本,代码分析心得

热门文章

  1. 大数据_Flink_数据处理_运行时架构3_yarn上作业提交流程---Flink工作笔记0018
  2. AndroidStudio_安卓原生开发_精美自定义多选控件_多选Spinner_MultiSpinner_拿来即用---Android原生开发工作笔记144
  3. Sharding-JDBC水平分库(水平数据库分片策略配置)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记010
  4. MyCat分布式数据库集群架构工作笔记0009---Mycat主--从复制配置上
  5. .NET/Dot Net学习笔记---.net理解,C#.net的基本类型,字符串转义字符处理..
  6. v540 检测的问题
  7. kafka消费者脚本无法启动问题
  8. SQLite数据操作
  9. rn 0.57打包常见错误_linux管道命令介绍及常见用于场景
  10. 素数c分解语言程序,PTA|《C语言程序设计实验与习题指导(第3版)》实验4-2-3 验证“哥德巴赫猜想” (20分)...