关键词:
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组件(代码片段)
浏览目录创建mldelform添加记录编辑记录 Django框架中的modelform组件通过名字我们可以看出来,这个组件的功能就是把model和form组合起来。下面我们来看一个例子:比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱... 查看详情
django框架之modelform组件(代码片段)
浏览目录创建mldelform添加记录编辑记录 Django框架中的modelform组件通过名字我们可以看出来,这个组件的功能就是把model和form组合起来。下面我们来看一个例子:比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱... 查看详情
django——form组件和modelform(代码片段)
一、原生form实现书城增删改查1、构建模型并完成数据库迁移(1)构建书城模型fromdjango.dbimportmodels#Createyourmodelshere.#创建一个图书管理系统的模型classBook(models.Model):title=models.CharField(max_length=32)price=models.DecimalField(max_digits=8, 查看详情
django组件-modelform(代码片段)
模型表单ModelForm一、基本用法?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172fromdjangoimportformsfromdjango.utils.safestringimportmark_safefromdjango.core.exceptionsimportValidationErrorfromrbacimportm... 查看详情
django-组件拾遗(代码片段)
知识预览一Django的form组件二Django的modelform组件三Django的缓存机制四Django的信号五Django的序列化一Django的form组件forms组件二Django的modelform组件这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合... 查看详情
django组件拾忆(代码片段)
知识预览一Django的form组件二Django的modelform组件三Django的缓存机制四Django的信号五Django的序列化回到顶部一Django的form组件回到顶部二Django的modelform组件这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model... 查看详情
django-缓存机制,form组件(代码片段)
知识预览一Django的form组件二Django的modelform组件三Django的缓存机制四Django的信号五Django的序列化回到顶部一Django的form组件回到顶部二Django的modelform组件这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model... 查看详情
modelform组件(代码片段)
Django的modelform组件这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,... 查看详情
django之modelform组件(代码片段)
1ModelForm2a.classMeta:3model,#对应Model的4fields=None,#字段5exclude=None,#排除字段6labels=None,#提示信息7help_texts=None,#帮助提示信息8widgets=None,#自定义插件9error_messages=None,#自定义错误信息(整体错误信息fromdjango.core.exceptionsimportNON_FIELD_ERRO... 查看详情
django之modelform组件(代码片段)
1ModelForm2a.classMeta:3model,#对应Model的4fields=None,#字段5exclude=None,#排除字段6labels=None,#提示信息7help_texts=None,#帮助提示信息8widgets=None,#自定义插件9error_messages=None,#自定义错误信息(整体错误信息fromdjango.core.exceptionsimportNON_FIELD_ERRORS)1... 查看详情
django之modelform详解(代码片段)
ModelForm是Django中编写基于Model定制表单的方法,可以提高Model复用性。 使用时Django会根据 django.db.models.Field (用于数据库衔接)自动转化为 django.forms.Field (用于表单前端展示、后端验证)。 编辑数据:如果... 查看详情
django之modelform(代码片段)
ModelForm: 应用场景: -ModelForm-中小型应用程序。因为ModelForm是依赖于models的 -Form & 查看详情
django之modelform(代码片段)
要说ModelForm,那就先说Form吧!先给出一个Form示例:models.pyfromdjango.dbimportmodelsclassUserType(models.Model):caption=models.CharField(max_length=32)classUserGroup(models.Model):name=models.CharField(max_length=32) 查看详情
django之modelform组件
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950ModelForm a. class Meta: &nbs 查看详情
django之modelform(代码片段)
简介Model+Form==>ModelForm。model和form的结合体,所以有以下功能:验证数据库操作Form回顾models.pyclassUserType(models.Model):caption=models.CharField(max_length=32)classUserInfo(models.Model):username=models.CharField(max_le 查看详情
django之modelform组件
Django之ModelForm组件 ModelForma.classMeta:model,#对应Model的fields=None,#字段exclude=None,#排除字段labels=None,#提示信息help_texts=None,#帮助提示信息widgets=None,#自定义插件error_messages=None,#自定义错误信息(整体错误信息fromdjango.co 查看详情
[django]django的modelform处理数据(代码片段)
django的form处理数据1.生成html2.验证数据合法性3.直接存库定义1个formclassBlogPost(models.Model):title=models.CharField(max_length=150)body=models.TextField()timestamp=models.DateTimeField()以前是这样的classBlogPostForm(forms.For 查看详情
django之modalform(代码片段)
ModelForm自己定义的form--->Form--->BaseForm自己定义的ModelForm--->ModelForm--->BaseModelForm--->BaseForm从上面可以看出form和ModelForm都是继承BaseForm,所以在Form中有的方法在ModelForm中也是有的,包括is_vali 查看详情