1. Model + Form ----> 验证 + 数据库操作
  1. class UserInfo(models.Model):
  2. username = models.CharField(max_length=32,verbose_name='用户名')
  3. email = models.EmailField(verbose_name='密码')
  4. user_type = models.ForeignKey(to='User_type',to_field='id',verbose_name='类型')
  5.  
  6. from django import forms
  7. from django.forms import fileds as Ffields
  8. from django.forms import widgets as Fwidgets *
  9. class UserInfoModelForm(forms.ModelForm):
  10. class Meta:
  11. model = models.UserInfo
  12. fields = '__all__' #生成所有的字段标签
  13. #fields = ['username','email'] #生成列表字段的标签
  14. #exclude = ['email'] #生成除了列表字段的标签
  15. Meta中的参数
  16. labels = {
  17. 'username':'xxx',
  18. 'email':'邮箱',
  19. }
  20. help_texts={ # 帮助提示信息
  21. 'username':'这里填写用户名',
  22. }
  23. widgets={ # 自定义插件,widgets为关键字不能改变,导包时要起别名
  24. 'usernmae':Fwidgets.Textarea(attrs={'k':'v'}),
  25. }
  26. error_messages={ # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
  27. '__all__':{
  28. ...
  29. }
  30. 'username':{
  31. 'required':'用户名不能为空',
  32. 'invalid':'用户名不合法'
  33. }
  34. }
  35. field_classes={ # 自定义字段类 (也可以自定义字段)
  36. 'email':Ffields.URLField #使用form中的类,因为关键字重复,导包时也要起别名
  37. }
  38. localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据 UTC --> 东八区时间
  39. 如:
  40. 数据库中
  41. 2016-12-27 04:10:57
  42. setting中的配置
  43. TIME_ZONE = 'Asia/Shanghai'
  44. USE_TZ = True
  45. 则显示:
  46. 2016-12-27 12:10:57
  1. 钩子与(Form一样):
  1. def clean_username(self):
  2. old = self.cleaned_data['username']
  3. return old
  4. #每个字段验证成功之后,可以追加操作

  1. ModelForm额外字段:

    例子:一个月免登录,这个字段不用做验证
  1. class UserInfoModelForm(forms.ModelForm):
      is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput())
  1. class Meta:
    model = models.UserInfo
  1. 函数处理:
  1. def user_edit(request, nid):
  2. # 获取当前id对象的用户信息
  3. # 显示用户已经存在数据
  4. if request.method == "GET":
  5. user_obj = models.UserInfo.objects.filter(id=nid).first()
  6. mf = UserInfoModelForm(instance=user_obj)
  7. return render(request,'user_edit.html',{'mf': mf, 'nid': nid})
  8. elif request.method == 'POST':
  9. user_obj = models.UserInfo.objects.filter(id=nid).first()
  10. mf = UserInfoModelForm(request.POST,instance=user_obj)
  11. #更新操作需要添加instance参数,创建新数据不需要添加
  12. if mf.is_valid():
  13. # obj.save() 拆分save操作↓↓↓↓↓↓
  14. instance = mf.save(False) #让save操作失效
  15. instance.save() #保存当前类
  16. mf.save_m2m() #保存多对多中间关联表
  17. else:
  18. print(mf.errors.as_json())
  19. return render(request,'user_edit.html',{'mf': mf, 'nid': nid})
  1. 继承
      Form -> BaseForm
      UserInfoModelForm -> ModelForm -> BaseModelForm -> BaseForm
    BaseForm 中定义了is_valid()、cleaned_dataerrors方法
    验证方法和Form一样

Django学习-23-ModelForm的更多相关文章

  1. django学习之- modelForm

    ModelForm(耦合很强) 可以实现 1:数据库操作 2:数据验证 使用地方:1:小型项目,2:自定制jdango admin 功能: 1:可以生成html标签:class Meta... 2:m ...

  2. django学习-23.admin管理后台的数据表数据的自定义展示

    目录结构 1.前言 2.自定义设置一张指定的数据表的列表展示内容 2.1.第一步:如果我们想让数据表[hello_person]里面的表字段值全部展示出来,需在应用[hello]里的[admin.py ...

  3. Python框架之Django学习

    当前标签: Django   Python框架之Django学习笔记(十四) 尛鱼 2014-10-12 13:55 阅读:173 评论:0     Python框架之Django学习笔记(十三) 尛 ...

  4. Django框架 之 modelform组件

    Django框架 之 modelform组件 浏览目录 创建mldelform 添加记录 编辑记录 Django框架中的modelform组件 通过名字我们可以看出来,这个组件的功能就是把model和 ...

  5. Django学习笔记(16)——扩展Django自带User模型,实现用户注册与登录

    一,项目题目:扩展Django自带User模型,实现用户注册与登录 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册,登录,用户认证,注销,修改密码等功能. ...

  6. Django 学习笔记1-- URLconf

    今天好像巴黎有点乱,希望明天太阳还会照常升起. 简介 Django 是一个由 Python 编写.开源并采用经典的 MVC 设计模式的 Web Full Stack 应用框架. 在 Django 中, ...

  7. 今天主要推荐一下django学习的网址!

    前言:每个月忙碌的头20天后,在上班时间投入到django理论学习的过程中,花了差不多3天时间简单的研究了一下django,着实废了我不少脑细胞. 采用虫师前辈的一张图和话: 如果你把这过程梳理清晰了 ...

  8. Django 学习笔记之四 QuerySet常用方法

    QuerySet是一个可遍历结构,它本质上是一个给定的模型的对象列表,是有序的. 1.建立模型: 2.数据文件(test.txt) 3.文件数据入库(默认的sqlite3) 入库之前执行 数据库同步命 ...

  9. Django 学习笔记之三 数据库输入数据

    假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...

  10. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

随机推荐

  1. JMS基础篇(二)

    简介 异构集成是消息发挥作用的一个领域,大型公司内部可能会遇到很多的平台,Java,.net或者公司自己的平台等. 传送消息还应该支持异步机制,以提高系统整体的性能.异步传输一条消息意味着,发送者不必 ...

  2. bzoj 3864: Hero meet devil [dp套dp]

    3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...

  3. BZOJ 4538: [Hnoi2016]网络 [整体二分]

    4538: [Hnoi2016]网络 题意:一棵树,支持添加一条u到v权值为k的路径,删除之前的一条路径,询问不经过点x的路径的最大权值 考虑二分 整体二分最大权值,如果\(k \in [mid+1, ...

  4. BZOJ 2724: [Violet 6]蒲公英 [分块 区间众数]

    传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][ ...

  5. 夏令营讲课内容整理 Day 5.

    DP专场.. 动态规划是运筹学的一个分支, 求解决策过程最优化的数学方法. 我们一般把动态规划简称为DP(Dynamic Programming)   1.动态规划的背包问题 有一个容量为m的背包,有 ...

  6. ES6,Array.includes()函数的用法

    在ES5,Array已经提供了indexOf用来查找某个元素的位置,如果不存在就返回-1,但是这个函数在判断数组是否包含某个元素时有两个小不足,第一个是它会返回-1和元素的位置来表示是否包含,在定位方 ...

  7. 初探solr搜索

    solr是一个基于lucene的搜索引擎,lucene是一个全文检索引擎的架构.solr在此之上进行了封装完善,变成了一个很流行实用的搜索引擎,可以应对绝大部分的搜索需求.使用搜索引擎有以下几点好处: ...

  8. 搭建dnsmasq服务器,局域网内部解析

    系统:centos6.5 公司内部需求一台dns server,解析内部域名(该域名不需要在公网上解析) 安装了"bind bind-utils"包,配置里设置转发到外部电信dns ...

  9. nginx的负载均衡集群测试

    分别在3台机子安装nginx和启动nginx服务. dir: 192.168.0.7 另外2台服务器为 192.168.0.5 ,192.168.0.6 在dir  192.168.0.7 上增加配置 ...

  10. angular ng build --prod 打包报错解决方案

    使用以下代码  就不报错了 ng build --prod --no-extract-license    打包命令 使用以下代码  就不报错了 ng build --prod --no-extrac ...