Django 组件-ModelForm
ModelForm
组件功能就是把model和form组合起来.
首先导入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":"用户名"
- }
如果想增加一个字段,就在class Meta 之前写这个字段
然后在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 拿到错误信息,还有student.field,是拿到每个字段,如果这个字段是多对多字段,还能stuent.field.queryset,拿到所有关联的字段,还能stuent.field.queryset.model,拿到所有关联的字段的类
有了这些,我们就可以通过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-control样式,可以考虑在后台的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,redirect
- from django.forms import ModelForm
- # Create your views here.
- from app01 import models
- def 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})
对于验证规则,很多浏览器都比较智能,会自动帮我们做一些验证,可以在form表单上加 novalidate 属性就可以不让浏览器为我们做验证
ModelForm还支持所有form的功能,比如钩子,所以我们就可以通过钩子来自定义验证规则
写法和forms的写法一样:
- class AuthorForm(forms.ModelForm):
- class Meta:
- model = Author
- fields = ('name', 'title')
- def clean_name(self):
- if ...
- return self.clean_data['name']
- else:
- raise ValidationError(‘sdgsadga’)
- ...
Django 组件-ModelForm的更多相关文章
- Django中Model-Form验证
Django中Model-Form验证 class UserType(models.Model): caption=models.CharField(max_length=32) class User ...
- python 全栈开发,Day78(Django组件-forms组件)
一.Django组件-forms组件 forms组件 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显 ...
- 【Django】ModelForm
ModelForm 1.Model与Form内容回顾 Model - 数据库操作 - 验证 class A(MOdel): user = email = pwd = Form - class Logi ...
- Django中ModelForm应用
Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...
- Django的ModelForm
基于django.forms.ModelForm:与模型类绑定的Form 先定义一个ModelForm类,继承ModelForm类 from django.forms import ModelForm ...
- Django 组件之 ----- content-type
Django 组件之 content-type的使用 一个表和多个表进行关联,但具体随着业务的加深,表不断的增加,关联的数量不断的增加,怎么通过一开始通过表的设计后,不在后期在修改表,彻底的解决这个问 ...
- python 全栈开发,Day76(Django组件-cookie,session)
昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...
- Django组件补充(缓存,信号,序列化)
Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...
- django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息
django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...
随机推荐
- js上传图片&预览(filereader)
fileReader HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileRea ...
- PHP 中使用explode()函数切割字符串为数组
explode()函数的作用:使用一个字符串分割另一个字符串,打散为数组. 例如: 字符串 $pizza = "第1 第2 第3 第4 第5 第6"; 根据空格分割后:$piece ...
- SpringInAction--条件化的Bean
学习了profile bean之后,发现有的时候bean还是有根据环境来选择的余地的,那么假设我们希望某个bean只有当另外某个特定的bean也声明了之后才会创建.我们还可能要求只有某个特定的环境变量 ...
- idea 配置springmvc+mybatis(图文教程)
idea配置 spirngmvc+maven+mybatis 数据库采用的是mysql 服务器容器用的是tomcat8 废话不多说直接干! 首先新建一个 maven工程, "File&qu ...
- Python面向对象的三大特征 --- 封装、继承、多态
一.封装 1)封装:是面向对象的一大特点:将属性和方法封装在一个抽象类中.外界使用类创建对象,然后让对象调用内部方法.对象方法的细节都被封装在类的内部. class Person(): def _ ...
- Python中注释的添加
1.Python中注释,有助于我们对程序的理解:但注释不需要每行都写,可以在方法前面注释该方法的功能 或重要的一行进行注释. 2.单行注释,使用#号: 3.多行注释,使用""&qu ...
- PostgreSQL资料汇总
慢慢积累一些有用的资料: https://postgrespro.ru
- 随手一写就是一个侧滑关闭activity
刚忙完一段时间,今天刚清闲会,就把以前写的东西整理整理.于是冥冥中发现有些东西完全可以共享出来,毕竟那么常见,而且简单实用. 实现原因 其实侧滑关闭activity在网上也有大量的文章去介绍他,我也有 ...
- Vim技能修炼教程(6) - 行编辑器
在很久很久以前,计算机的运算能力还很弱,终端与主机的通信也不好.在没有显示器的时代,只能通过电传打字机跟主机通信.那时候只有行编辑器,编辑的时候只能在一行中进行.需要显示哪一行,就把哪一行或者哪几行打 ...
- tomcat的localhost-config is missing 错误的解决方法
运行项目时报错,错误信息为: The tomcat server configuration at /sever/tomcat v7.0 localhost-config is missing 解决方 ...