侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python探索之ModelForm代码详解

Python  /  管理员 发布于 7年前   153

这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,对,你没猜错,相信自己的英语水平。

先来一个简单的例子来看一下这个东西怎么用:

比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册时间等等一大堆信息,现在让你写一个创建学生的页面,你的后台应该怎么写呢?

首先我们会在前端一个一个罗列出这些字段,让用户去填写,然后我们从后天一个一个接收用户的输入,创建一个新的学生对象,保存

其实,重点不是这些,而是合法性验证,我们需要在前端判断用户输入是否合法,比如姓名必须在多少字符以内,电话号码必须是多少位的数字,邮箱必须是邮箱的格式这些

当然可以一点一点手动写限制,各种判断,这毫无问题,除了麻烦

我们现在有个更优雅(以后在Python相关的内容里,要多用“优雅”这个词,并且养成习惯)的方法:ModelForm

先来简单的,生硬的把它用上,再来加验证条件:

首先导入ModelForm

from django.forms import ModelForm

在视图函数中,定义一个类,比如就叫StudentList,这个类要继承ModelForm,在这个类中再写一个原类Meta(规定写法,并注意首字母是大写的)

在这个原类中,有以下属性(部分):

class StudentList(ModelForm):  class Meta:    model = models.Student #对应的Model中的类    fields = "__all__"   #字段,如果是__all__,就是表示列出所有的字段    exclude = None     #排除的字段    labels = None      #提示信息    help_texts = None    #帮助提示信息    widgets = None     #自定义插件    error_messages = None  #自定义错误信息#error_messages用法:    error_messages = {      'name':{'required':"用户名不能为空",},      'age':{'required':"年龄不能为空",},    }#widgets用法,比如把输入用户名的input框给为Textarea#首先得导入模块    from django.forms import widgets as wid #因为重名,所以起个别名    widgets = {      "name":wid.Textarea(attrs={"class":"c1"}) #还可以自定义属性    }#labels,自定义在前端显示的名字    labels= {      "name":"用户名"    }

然后在url对应的视图函数中实例化这个类,把这个对象传给前端

def student(request):  if request.method == 'GET':    student_list = StudentList()    return render(request,'student.html',{'student_list':student_list})

然后前端只需要     {{ student_list.as_p }}   一下,所有的字段就都出来了,可以用as_p显示全部,也可以通过for循环这student_list,拿到的是一个个input框,现在我们就不用as_p,手动把这些input框搞出来,as_p拿到的页面太丑。

首先 for循环这个student_list,拿到student对象,直接在前端打印这个student,是个input框
student.label  ,拿到数据库中每个字段的verbose_name ,如果没有设置这个属性,拿到的默认就是字段名

还可以通过student.errors.0 拿到错误信息

有了这些,我们就可以通过bootstrap,自己拼出来想要的样式了

比如:

<body>  <div class="container" >    <h1>student</h1>    <form method="POST" novalidate>      {% csrf_token %}{#      {{ student_list.as_p }}#}      {% for student in student_list %}        <div class="form-group col-md-6">         {# 拿到数据字段的verbose_name,没有就默认显示字段名 #}          <label class="col-md-3 control-label">{{ student.label }}</label>          <div class="col-md-9" style="position: relative;">{{ student }}</div>        </div>      {% endfor %}      <div class="col-md-2 col-md-offset-10">        <input type="submit" value="提交" class="btn-primary">      </div>    </form>  </div></body>

现在还缺一个input框的form-contral样式,可以考虑在后台的widget里面添加

比如这样:

from django.forms import widgets as wid #因为重名,所以起个别名    widgets = {      "name":wid.TextInput(attrs={'class':'form-control'}),      "age":wid.NumberInput(attrs={'class':'form-control'}),      "email":wid.EmailInput(attrs={'class':'form-control'})    }

当然也可以在js中,找到所有的input框,加上这个样式,也行

保存数据的时候,不用挨个取数据了,只需要save一下

def student(request):  if request.method == 'GET':    student_list = StudentList()    return render(request,'student.html',{'student_list':student_list})  else:    student_list = StudentList(request.POST)    if student_list.is_valid():      student_list.save()    return redirect(request,'student_list.html',{'student_list':student_list})

编辑数据:

如果不用ModelForm,编辑的时候得显示之前的数据吧,还得挨个取一遍值,如果ModelForm,只需要加一个instance=obj(obj是要修改的数据库的一条数据的对象)就可以得到同样的效果

保存的时候要注意,一定要注意有这个对象(instance=obj),否则不知道更新哪一个数据

代码示例:

from django.shortcuts import render,HttpResponse,redirectfrom django.forms import ModelForm# Create your views here.from app01 import modelsdef test(request):  # model_form = models.Student  model_form = models.Student.objects.all()  return render(request,'test.html',{'model_form':model_form})class StudentList(ModelForm):  class Meta:    model = models.Student #对应的Model中的类    fields = "__all__"   #字段,如果是__all__,就是表示列出所有的字段    exclude = None     #排除的字段    labels = None      #提示信息    help_texts = None    #帮助提示信息    widgets = None     #自定义插件    error_messages = None  #自定义错误信息#error_messages用法:    error_messages = {      'name':{'required':"用户名不能为空",},      'age':{'required':"年龄不能为空",},    }#widgets用法,比如把输入用户名的input框给为Textarea#首先得导入模块    from django.forms import widgets as wid #因为重名,所以起个别名    widgets = {      "name":wid.Textarea    }#labels,自定义在前端显示的名字    labels= {      "name":"用户名"    }def student(request):  if request.method == 'GET':    student_list = StudentList()    return render(request,'student.html',{'student_list':student_list})  else:    student_list = StudentList(request.POST)    if student_list.is_valid():      student_list.save()    return render(request,'student.html',{'student_list':student_list})def student_edit(request,pk):  obj = models.Student.objects.filter(pk=pk).first()  if not obj:    return redirect('test')  if request.method == "GET":    student_list = StudentList(instance=obj)    return render(request,'student_edit.html',{'student_list':student_list})  else:    student_list = StudentList(request.POST,instance=obj)    if student_list.is_valid():      student_list.save()    return render(request,'student_edit.html',{'student_list':student_list})

总结

以上就是本文关于Python探索之ModelForm代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:python编程羊车门问题代码示例、python中requests使用代理proxies方法介绍等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


  • 上一条:
    Python面向对象编程基础解析(一)
    下一条:
    Mac中Python 3环境下安装scrapy的方法教程
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客