ModelForm

1.Model与Form内容回顾

  1. Model
  2. - 数据库操作
  3. - 验证
  4. class A(MOdel):
  5. user =
  6. email =
  7. pwd =
  8.  
  9. Form
  10. - class LoginForm(Form):
  11. email = fields.EmailField()
  12. user =
  13. pwd =
  14.  
  15. - is_valid -> 每一个字段进行正则(字段内置正则)+clean_字段 -> clean(__all__) -> _post_clean
  16. - cleand_data
  17. - error

2.ModelForm的作用

Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分别定义Form类和Model类会比较麻烦,最简单的方式就是通过Model来生成一个Form类,Django内置的ModelForm就是为此而生的.

ModelForm作为model和form的结合体,所以有以下功能

  • 验证
  • 数据库操作

3.创建models.py

  1. from django.db import models
  2.  
  3. class UserType(models.Model):
  4. caption = models.CharField(max_length=32)
  5.  
  6. class UserGroup(models.Model):
  7. name = models.CharField(max_length=32)
  8.  
  9. class UserInfo(models.Model):
  10. username = models.CharField(verbose_name='用户',max_length=32)
  11. email = models.EmailField(verbose_name='邮箱')
  12. user_type = models.ForeignKey(to='UserType',to_field='id')
  13. u2g = models.ManyToManyField(UserGroup)

app01/models.py

4.创建ModelForm,获取models.py字段数据

  1. from django.shortcuts import render,HttpResponse,redirect
  2. from django import forms
  3. from app01 import models
  4.  
  5. class UserInfoModelForm(forms.ModelForm): #ModelForm直接用models字段
  6. class Meta:
  7. model = models.UserInfo #表示去models.py文件中UserInfo类获取字段
  8. fields = '__all__' #获取所有字段
  9. # fields = ['username','email','user_type'] #获取指定的字段
  10. # exclude = ['username'] #获取username以外其他字段
  11.  
  12. def index(request):
  13. if request.method == "GET":
  14. obj = UserInfoModelForm()
  15. return render(request,"index.html",{'obj':obj})
  16. elif request.method == "POST":
  17. obj = UserInfoModelForm(request.POST)
  18. print(obj.is_valid()) # 这是方法,别忘记了加括号
  19. print(obj.cleaned_data)
  20. print(obj.errors)
  21. return render(request,"index.html",{'obj':obj})

app01/views.py

5、ModelForm组件

  1. ModelForm
  2. a. class Meta:
  3. model, # 对应Model的
  4. fields=None, # 字段
  5. exclude=None, # 排除字段
  6. labels=None, # 提示信息
  7. help_texts=None, # 帮助提示信息
  8. widgets=None, # 自定义插件
  9. error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
  10. field_classes=None # 自定义字段类 (也可以自定义字段)
  11. localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据
  12. 如:
  13. 数据库中
  14. 2016-12-27 04:10:57
  15. setting中的配置
  16. TIME_ZONE = 'Asia/Shanghai'
  17. USE_TZ = True
  18. 则显示:
  19. 2016-12-27 12:10:57
  20. b. 验证执行过程
  21. is_valid -> full_clean -> 钩子 -> 整体错误
  22.  
  23. c. 字典字段验证
  24. def clean_字段名(self):
  25. # 可以抛出异常
  26. # from django.core.exceptions import ValidationError
  27. return "新值"
  28. d. 用于验证
  29. model_form_obj = XXOOModelForm()
  30. model_form_obj.is_valid()
  31. model_form_obj.errors.as_json()
  32. model_form_obj.clean()
  33. model_form_obj.cleaned_data
  34. e. 用于创建
  35. model_form_obj = XXOOModelForm(request.POST)
  36. #### 页面显示,并提交 #####
  37. # 默认保存多对多
  38. obj = form.save(commit=True)
  39. # 不做任何操作,内部定义 save_m2m(用于保存多对多)
  40. obj = form.save(commit=False)
  41. obj.save() # 保存单表信息
  42. obj.save_m2m() # 保存关联多对多信息
  43.  
  44. f. 用于更新和初始化
  45. obj = model.tb.objects.get(id=1)
  46. model_form_obj = XXOOModelForm(request.POST,instance=obj)
  47. ...
  48.  
  49. PS: 单纯初始化
  50. model_form_obj = XXOOModelForm(initial={...})ModelForm
  51. a. class Meta:
  52. model, # 对应Model的
  53. fields=None, # 字段
  54. exclude=None, # 排除字段
  55. labels=None, # 提示信息
  56. help_texts=None, # 帮助提示信息
  57. widgets=None, # 自定义插件
  58. error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
  59. field_classes=None # 自定义字段类 (也可以自定义字段)
  60. localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据
  61. 如:
  62. 数据库中
  63. 2016-12-27 04:10:57
  64. setting中的配置
  65. TIME_ZONE = 'Asia/Shanghai'
  66. USE_TZ = True
  67. 则显示:
  68. 2016-12-27 12:10:57
  69. b. 验证执行过程
  70. is_valid -> full_clean -> 钩子 -> 整体错误
  71.  
  72. c. 字典字段验证
  73. def clean_字段名(self):
  74. # 可以抛出异常
  75. # from django.core.exceptions import ValidationError
  76. return "新值"
  77. d. 用于验证
  78. model_form_obj = XXOOModelForm()
  79. model_form_obj.is_valid()
  80. model_form_obj.errors.as_json()
  81. model_form_obj.clean()
  82. model_form_obj.cleaned_data
  83. e. 用于创建
  84. model_form_obj = XXOOModelForm(request.POST)
  85. #### 页面显示,并提交 #####
  86. # 默认保存多对多
  87. obj = form.save(commit=True)
  88. # 不做任何操作,内部定义 save_m2m(用于保存多对多)
  89. obj = form.save(commit=False)
  90. obj.save() # 保存单表信息
  91. obj.save_m2m() # 保存关联多对多信息
  92.  
  93. f. 用于更新和初始化
  94. obj = model.tb.objects.get(id=1)
  95. model_form_obj = XXOOModelForm(request.POST,instance=obj)
  96. ...
  97.  
  98. PS: 单纯初始化
  99. model_form_obj = XXOOModelForm(initial={...})

注意:导入模块名(fields、widgets)和字段名重复,所以导入时要起个别名。

  1. from django.forms import fields as Ffields
  2. from django.forms import widgets as Fwidgets
  3.  
  4. 关于Meta的使用方法:
  5. class Meta:
  6. model = models.UserInfo
  7. fields = '__all__'
  8. # fields = ['username','email']
  9. # exclude = ['username']
  10. labels = {
  11. 'username': '用户名',
  12. 'email': '邮箱',
  13. 'user_type':'一对多',
  14. 'u2g': '多对多',
  15. }
  16. help_texts = {
  17. 'username': '...'
  18. }
  19. widgets = {
  20. 'username': Fwidgets.Textarea(attrs={'class': 'c1'})
  21. }
  22. error_messages = {
  23. '__all__':{ # 整体错误信息
  24.  
  25. },
  26. 'email': {
  27. 'required': '邮箱不能为空',
  28. 'invalid': '邮箱格式错误..',
  29. }
  30. }
  31. field_classes = { # 定义字段的类是什么
  32. # 'email': Ffields.URLField # 这里只能填类,加上括号就是对象了。
  33. }
  34.  
  35. # localized_fields=('ctime',) # 哪些字段做本地化

6.ModelForm 数据库操作——创建数据save

  1. def index(request):
  2. if request.method == "GET":
  3. obj = UserInfoModelForm()
  4. return render(request,'index.html',{'obj': obj})
  5. elif request.method == "POST":
  6. obj = UserInfoModelForm(request.POST)
  7. if obj.is_valid():
  8. obj.save() # 等价以下三句
  9. # instance = obj.save(False)
  10. # instance.save()
  11. # obj.save_m2m()
  12. return render(request,'index.html',{'obj': obj})

app01/views.py #对index函数进行修改及可

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app01 import views
  4.  
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^index/', views.index),
  8. ]

project/urls.py

  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="/index/" method="POST">
  9. {% csrf_token %}
  10. {{ obj.as_p }}
  11. <input type="submit" value="提交"/>
  12. </form>
  13. </body>
  14. </html>

templates/index.html

7.ModelForm 数据库操作——修改数据

  1. urlpatterns = [
  2. url(r'^user_list/', views.user_list), #新增
  3. url(r'^edit-(\d+)/', views.user_edit), #新增
  4. ]

project/urls.py

  1. def user_list(request):
  2. li = models.UserInfo.objects.all().select_related('user_type')#跨表取数据
  3. return render(request,'user_list.html',{'li':li})
  4.  
  5. def user_edit(request,nid):
  6. #获取当前ID对象的用户信息
  7. #显示用户已经存在数据
  8. if request.method == 'GET':
  9. user_obj = models.UserInfo.objects.filter(id=nid).first()
  10. mf = UserInfoModelForm(instance=user_obj) #instance=user_obj,把默认数据传递进去,显示经存在数据
  11. return render(request, 'user_edit.html',{'mf':mf,nid:'nid'})
  12. elif request.method == 'POST':
  13. user_obj = models.UserInfo.objects.filter(id=nid).first()
  14. mf = UserInfoModelForm(request.POST,instance=user_obj) # 指定给谁做修改
  15. if mf.is_valid():
  16. mf.save()
  17. else:
  18. print(mf.errors.as_json)
  19. return render(request, 'user_edit.html',{'mf':mf,nid:'nid'})

app01/views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul>
  9. {% for k in li %}
  10. <li>{{ k.username }}-{{ k.user_type.caption }}-|<a href="/edit-{{ k.id }}">编辑</a></li>
  11. {% endfor %}
  12.  
  13. </ul>
  14. </body>
  15. </html>

templates/user_list.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="/edit-{{ nid }}/" method="post">
  9. {% csrf_token %}
  10. {{ mf.as_p }}
  11. <input type="submit" value="提交"/>
  12. </form>
  13. </body>
  14. </html>

templates/user_edit.html

【Django】ModelForm的更多相关文章

  1. 【Django】--ModelForm组件

    ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...

  2. 【Django】ORM操作#1

    目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...

  3. 【Django】 初步学习

    这个系列(或者成不了一个系列..)预计会全程参考Vamei様的Django系列,膜一发.说句题外话,其实更加崇拜像Vamei那样的能够玩转生活.各个领域都能取得不小成就的人. [Django] ■ 概 ...

  4. 【Django】ORM操作#2

    目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...

  5. 【Django】--Model字段

    参考地址:http://www.cnblogs.com/wupeiqi/articles/6216618.html 所有字段 AutoField(Field) --int自增列,必须填入参数prima ...

  6. 【Django】Web应用开发经由

    [Django开发经由] 本来以为看完网上的入门教程之后就可以看书详细学习一下,没想到手头上的这本书也讲得不是太详细..无奈,不过好在这本书从无到有建立一个网站的流程还算可以,就以这个角度简单记录一下 ...

  7. Python开发【Django】:Form组件

    Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...

  8. 【django】form

    form 组件组要功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 1.创建Form类时,主要涉及到 [字段] 和 [插件],字段用于 ...

  9. 【Django】--Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 例子: 1.创建Form类 from djan ...

随机推荐

  1. unity之初级

  2. Leetcode之二分法专题-374. 猜数字大小(374. Guess Number Higher or Lower)

    Leetcode之二分法专题-374. 猜数字大小(374. Guess Number Higher or Lower) 我们正在玩一个猜数字游戏. 游戏规则如下:我从 1 到 n 选择一个数字. 你 ...

  3. Anaconda简单使用手册

    安装部分 准备工作 下载各平台对应的安装包,各平台安装包下载链接如下: Windows macOs Linux 安装过程 安装过程在此不给出具体过程,可参照官方给出教程,各平台对应教程如下: Wind ...

  4. NLP(二十) 利用词向量实现高维词在二维空间的可视化

    准备 Alice in Wonderland数据集可用于单词抽取,结合稠密网络可实现其单词的可视化,这与编码器-解码器架构类似. 代码 from __future__ import print_fun ...

  5. bzoj 1146 网络管理Network (CDQ 整体二分 + 树刨)

    题目传送门 题意:求树上路径可修改的第k大值是多少. 题解:CDQ整体二分+树刨. 每一个位置上的数都会有一段持续区间 根据CDQ拆的思维,可以将这个数拆成出现的时间点和消失的时间点. 然后通过整体二 ...

  6. HihoCoder - 1617 方格取数

    HihoCoder - 1617 (从群主那里借鉴来的, 群主好强啊) 题意:中文题不解释... 题解: dp[X][i][j] 代表的是X是坐标之和 第一个人 走到位置 dp[i][x-i] 第二个 ...

  7. CF 988E Divisibility by 25 思维 第十二

    Divisibility by 25 time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  8. yzoj2057 x 题解

    题意:给出一个集合,要求把这个集合分成两部分,使得一个集合中的任一元素都与另一个集合的全部元素都两两互质 暴力 枚举每个元素O(n^2)再暴力判gcd=1,如果非1就放入不同集合内,用并查集维护联通块 ...

  9. Mysql高手系列 - 第7篇:玩转select条件查询,避免踩坑

    这是Mysql系列第7篇. 环境:mysql5.7.25,cmd命令中进行演示. 电商中:我们想查看某个用户所有的订单,或者想查看某个用户在某个时间段内所有的订单,此时我们需要对订单表数据进行筛选,按 ...

  10. 微服务时代之自定义archetype(模板/骨架/脚手架)

    1. 场景描述 (1)随着微服务越来越常见,一个大的项目会被拆分成多个小的微服务,jar包以及jar之间的版本冲突问题,变得越来越常见,如何保持整体微服务群jar及版本统一,也变成更加重要了,mave ...