一、简介
Django中Model负责操作数据库,并且具有简单的数据库验证功能(基本不用);Form用于用户请求的验证,具有强悍的数据库验证功能;ModelForm是将二者合二为一,即可用于数据库操作(部分),也可用于用户请求的验证(部分)!但由于ModelForm的耦合性太强,其作用一般用作于结构简单的小站点或者重写Django Admin,其实Django Admin就是利用ModelForm的功能实现的。
# 示例 # modelForm.py from django import forms from app01 import * class BookModelForm(forms.ModelForm): class Meta: model = Book fields = "__all__" # 所有字段 # fields = ["title", "price"] # 指定某些字段 exclude = ["price"] # 排除某些字段 labels = {"title": "输入书名"} # 修改提示信息 help_texts = {"title": "*"} # 帮助提示信息 widgets = {"title": ws.Textarea} # 使用widgets插件 error_messages = {"title": {"required": "必填"}} # 定义错误信息 # models.py class Book(models.Model): title = models.CharField(max_length=100, verbose_name="书名") authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher, verbose_name="出版社") publication_date = models.DateField(null=True) price = models.DecimalField(max_digits=5, decimal_places=2, default=10, verbose_name="价格") def __str__(self): return self.title
既然ModelForm的缺点那么多,我们为什么还要使用ModelForm呢?直接使用Form不是更好么?实际开发过程中,没有什么最好的,只有最合适的。ModelForm在某些环境下,优点多多啊!ModelForm不必像Form一样写一大堆的验证规则,大家有没有发现其实Form中很多的条件跟Model中定义字段设置的条件一模一样的,只不过Model不会做验证而已,就相当于一模一样的东西写了两份。
但是在ModelForm就不必了,你只需写上四行简单的代码就可以套用Model中已经定义好的规则来使用!如下所示,就这么简单。你在Model字段中定义的最大值,最小值,Email字段验证等等,已经通通生效了!
from django import forms class BookModelForm(forms.ModelForm): class Meta: model = Book fields = "__all__" # 所有字段
二、ModelForm参数
class Meta: model # 对应Model的表名 fields # 需要显示的字段,“__all__”代表所有字段,也可以写成元组或列表方式 exclude # 排除的字段,后面跟列表或元组 labels # 提示信息,后面跟字典 help_texts # 帮助提示信息,后面跟字典 widgets # 自定义插件,需要先导入widgets模块 error_messages # 自定义错误信息,后面跟字典
三、ModelForm验证过程
ModelForm跟Form一样,也具有自动生成HTML代码的功能,请看以下示例。当第一次发送GET请求时,利用ModelForm自动生成HTML代码的功能,自动生成前端代码。当第二次前端发送POST请求时,先用is_valid验证数据,这一步是必须做的,不写这一步,ModelForm怎么验证!
如果is_valid()=True,clean()中保存所有正确的信息;如果is_valid()=FALSE,errors中保存着错误信息,使用as_json()把HTML无序列表代码转换成字典。
我在前面说了,ModelForm也具有部分数据库操作功能,save()方法可以直接将数据保存到数据库中。需要有一点要注意的,生成ModelForm对象时,如果里面不包含instance参数就是新数据插入,有instance就是更新。
# views.py def book2(request, bid): if request.method == ‘GET‘: obj = Book.objects.get(id=bid) form = BookModelForm(instance=obj) return render(request, "book2.html", locals()) elif request.method == ‘POST‘: obj = Book.objects.get(id=bid) form = BookModelForm(request.POST, instance=obj) # 这里如果不加Instance就成了插入,加入就是更新 if form.is_valid(): print(form.clean()) form.save() else: print(form.errors.as_json()) return render(request, "book2.html", locals()) # book2.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/edit_book_{{ bid }}/" method="post"> {% csrf_token %} {{ form.as_p }} <input type="submit" value="submit"> </form> </body> </html> # urls.py urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^edit_book_(\d+)/‘, views.book2), ]
本文出自 “戴柏阳的博客” 博客,请务必保留此出处http://daibaiyang119.blog.51cto.com/3145591/1977895
原文地址:http://daibaiyang119.blog.51cto.com/3145591/1977895