Django modelforms
Model:强大的数据管理,弱小的数据验证
Form:强大的数据验证,弱小的数据管理
已经是2个强大的模块了,Django为了在小型项目上更加方便简单的使用者2个功能,提供了ModelForms,(admin 使用的就是ModelForms).
优点: 方便简单,
缺点: 耦合性太强.
ModelForms的使用,只需简单三步:
1.先在models创建表,万年不变的book,author,press:
from django.db import models # Create your models here. class Book(models.Model): name_B=models.CharField(max_length=32) author=models.ForeignKey("Author",on_delete=models.CASCADE) press=models.ManyToManyField("Press") class Author(models.Model): name_A=models.CharField(max_length=32) profile=models.CharField(max_length=32) class Press(models.Model): name_P=models.CharField(max_length=32) address=models.CharField(max_length=32)
2.写ModelsForms,(任意位置,最好单独写在一个py文件里):
from django import forms from django.forms import fields from myp001 import models class mfbook(forms.ModelForm): class Meta: #必要的2个字段 model=models.Book#-----------固定字段,绑定models里面的表,注意是Book不是Book() fields="__all__"#-------------固定字段,想要获取表里面的哪些列,all代表所有 #####此处省略各种参数,后面介绍
3.view里面导入写好的ModelForms,创建对象,将对象传到前端,搞定!
from django.shortcuts import render from utils import mf # Create your views here. def mflg(req): if req.method=="GET": obj=mf.mfbook() return render(req,"mfh.html",{'obj':obj})
,前端写上{{obj.as_p}},效果如下:

这就弄好了!想要验证数据也很简单,由于ModelForms继承的 BaseModelForm---BaseForm,所以forms的所有验证方法都能用:
views:
def mflg(req): if req.method=="GET": obj=mf.mfbook() return render(req,"mfh.html",{'obj':obj}) elif req.method=="POST": obj=mf.mfbook(req.POST)#用法和forms一样 print(obj.is_valid()) print(obj.cleaned_data) print(obj.error)
然后就是models的功能了:
添加:
1.将获取到的数据经过验证后直接添加save()--增
views:
from django.shortcuts import render from utils import mf # Create your views here. def mflg(req): if req.method=="GET": obj=mf.mfbook() return render(req,"mfh.html",{'obj':obj}) elif req.method=="POST": obj=mf.mfbook(req.POST)#用法和forms一样 if obj.is_valid(): obj.save() #这样就添加了, ###这里save()里面还有个参数commit,默认是True,意思就是所有数据都添加,如果等于False,就是只添加当前models对象,不会添加多对多的对象 # 我们可以自己制定制定添加那些数据 # instance = obj.save(False) # instance.save()保存当前models对象 # obj.save_m2m()保存多对多对象 return render(req,"mfh.html",{'obj':obj})
2,用到instance=一个字段对象:查
###urls: from django.contrib import admin from django.urls import path,include,re_path from myp001 import views urlpatterns = [ path('admin/', admin.site.urls), re_path(r'/mf001_(\d+)',views.mflg) ] ###html: <form action="/myp001/mf001_{{ nid }}" method="POST"> {{ obj.as_p }} <input type="submit" value="提交"> </form> ###views from django.shortcuts import render from utils import mf from myp001 import models # Create your views here. def mflg(req,nid):#nid接收path传过来的参数 if req.method=="GET": m_obj=models.Book.objects.get(id=nid) obj=mf.mfbook(instance=m_obj) return render(req,"mfh.html",{'obj':obj,'nid':nid})
输入:http://localhost:8081/myp001/mf001_2得如下显示(把字段内容全部渲染在了页面上):

3.改,类似查
###urls: from django.contrib import admin from django.urls import path,include,re_path from myp001 import views urlpatterns = [ path('admin/', admin.site.urls), re_path(r'/mf001_(\d+)',views.mflg) ] ###html: <form action="/myp001/mf001_{{ nid }}" method="POST"> {{ obj.as_p }} <input type="submit" value="提交"> </form> ###views from django.shortcuts import render from utils import mf from myp001 import models # Create your views here. def mflg(req,nid):#nid接收path传过来的参数 if req.method=="GET": m_obj=models.Book.objects.get(id=nid) obj=mf.mfbook(instance=m_obj) return render(req,"mfh.html",{'obj':obj,'nid':nid}) elif req.method=="POST": m_obj = models.Book.objects.get(id=nid) obj=mf.mfbook(req.POST,instance=m_obj)######### if obj.is_valid(): obj.save() return render(req, "mfh.html", {'obj': obj})
这样写django还帮我们处理了当数据库修改后页面上的字段没有修改的问题(详见写的django modles篇幅).
删除操作过于简单,直接获取对象delect 就是删除了,ModelsForms里面没有直接操作删除的.
下面介绍下ModelsForms 中其他字段功能:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在class xxx(forms.ModelForm):
class meta:
各种字段
1.model-----用于绑定models中的某个表,值能绑定一个
2.fields------绑定字段,全部用__all__表示,多个字段用迭代对象表示:
class mfbook(forms.ModelForm): class Meta: model=models.Book fields="__all__"#全部字段 fields=['name_B','author']#某些字段
3.exclude-----除开那些字段
class mfbook(forms.ModelForm): class Meta: model=models.Book exclude=["name_B"]
4.labels-----前缀信息:
class mfbook(forms.ModelForm): class Meta: model=models.Book fields="__all__"#全部字段 labels={ "name_B":'姓名', 'author':'sb' }

5.help_texts -----帮助信息,在生成标签后面显示帮助信息:
class mfbook(forms.ModelForm): class Meta: model=models.Book fields="__all__"#全部字段 help_texts={ "name_B":'sb请写名字', 'author':'sb作者' }
6.widgets----自定义表现显示,和form一样:
from django.forms import fields,widgets as ws#需要导入widgets包,避免重名as ws区别 class mfbook(forms.ModelForm): class Meta: model=models.Book fields="__all__"#全部字段 widgets={ "name_B": ws.Textarea(attrs={'class':'n'}),#自定义标签,也可以加属性 }
7. error_messages-----错误信息:
class mfbook(forms.ModelForm): class Meta: model=models.Book fields="__all__"#全部字段 error_messages={ "name_B":{'require':'请输入你的名字',"invalid":"无效的名字"}, }
8.field_classes-------自定义验证字段,二次验证,在models验证之后再做验证:
class mfbook(forms.ModelForm): class Meta: model=models.Book fields="__all__"#全部字段 field_classes={ "name_B": forms.Emailfield#将这个字段改成邮箱验证方式,注意这里只能写成类的形式,不能加() }
9.在ModelsForms里面添加Forms字段,字段添加后与数据库无关,只是显示页面和验证,与db存储无关,如与models里面的字段重名,则覆盖models里面的字段:
class mfbook(forms.ModelForm): email=forms.EmailField()#覆盖models里面的字段 pwd=forms.CharField()#在页面多显示字段 class Meta: model=models.Book fields="__all__"#全部字段

浙公网安备 33010602011771号