博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django中的ModelForm
阅读量:6693 次
发布时间:2019-06-25

本文共 8611 字,大约阅读时间需要 28 分钟。

一、ModelForm的基本用法示例:

from django import formsfrom app01 import modelsclass BookModelForm(forms.ModelForm):    #必须是这个类名    class Meta:        # 告诉Django这个form类和那个model类对应        model = models.Book        # 告诉Django这个form类里面有哪些字段        fields = "__all__"        widgets = {            "publish_date": forms.widgets.DateInput(                # 给日期字段添加日期类型                attrs={"type": "date"}            )        }        labels = {            "title": "书名",            "price": "价格",            "publish_date": '出版日期',            "publisher": "出版社名称",            "authors": "作者"        }        error_messages = {            "title": {                "required": "书名不能为空"            }        }    # 通过修改类的初始化方法达到批量添加共同属性的目的    def __init__(self, *args, **kwargs):        super(BookModelForm, self).__init__(*args, **kwargs)        # for field_name in self.base_fields:        for field in iter(self.fields):            self.fields[field].widget.attrs.update({                'class': 'form-control'            })

ModelForm所有属性:

class Meta:            model,                           # 对应Model的            fields=None,                     # 字段            exclude=None,                    # 排除字段            labels=None,                     # 提示信息            help_texts=None,                 # 帮助提示信息            widgets=None,                    # 自定义插件            error_messages=None,             # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)            field_classes=None               # 自定义字段类 (也可以自定义字段)            localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据

ModelForm用于验证用户数据:is_valid()

model_form_obj = XXOOModelForm()   //实例化对象        model_form_obj.is_valid()   // 校验数据        model_form_obj.errors.as_json()  //错误        model_form_obj.clean()   //同Form组件中的属性        model_form_obj.cleaned_data  // 同Form组件中的属性

ModelForm用于创建数据:save()

def add_book(request):    if request.method == "POST":        #直接传request.POST,进行ModelForm的实例化传参        form_obj = forms.BookModelForm(request.POST)        if form_obj.is_valid(): # 校验数据            form_obj.save()   #直接就可以保存数据到数据库,包括多对多,多对一,一对一的关系            return redirect("/book_list/")    #ModelForm实例化对象    form_obj = forms.BookModelForm()    return render(request, "v2/add_book.html", locals())

ModelForm用于初始化:ModelForm(instance=model_obj)

def edit_book(request, pk):    book_obj = models.Book.objects.filter(id=pk).first()    #form_obj通过initial设置初始化的值,例如,图书管理系统中的编辑书籍功能,    #点击编辑后跳转到编辑书籍页面,跳转后需要用要编辑的书籍信息填充页面对应信息。    #不同于Form组件的是,ModelForm直接就可以传实例化的对象,而不需要将对象转化成字典的形式传。    form_obj = forms.BookModelForm(instance=book_obj)      return render(request, "v2/edit_book.html", locals())

ModelForm用于更新 :ModelForm(request.POST, instance=book_obj)

def edit_book(request, pk):    book_obj = models.Book.objects.filter(id=pk).first()    if request.method == "POST":        #修改数据时,直接可以将用户数据包request.POST传进去,        #再传一个要修改的对象的示例,ModelForm就可以自动完成修改数据了。        form_obj = forms.BookModelForm(request.POST, instance=book_obj)        if form_obj.is_valid():  // 数据校验            form_obj.save()   // 直接保存        return redirect("/book_list/")    #form_obj通过initial设置初始化的值,例如,图书管理系统中的编辑书籍功能,    #点击编辑后跳转到编辑书籍页面,跳转后需要用要编辑的书籍信息填充页面对应信息。    #不同于Form组件的是,ModelForm直接就可以传实例化的对象,而不需要将对象转化成字典的形式传。    form_obj = forms.BookModelForm(instance=book_obj)      return render(request, "v2/edit_book.html", locals())

二、ModelForm和Form组件的应用场景:

  • ModelForm ---- 中小型应用程序。因为ModelForm是依赖于models的。
  • Form ------- 大型应用程序

三、通过ModelForm实现的书籍、作者、出版社的管理代码示例:

  1. 表结构:
from django.db import modelsclass Publisher(models.Model):    name = models.CharField(max_length=12)    address = models.TextField()    def __str__(self):        return self.nameclass Author(models.Model):    name = models.CharField(max_length=12)    gender = models.SmallIntegerField(        choices=((0, '女'), (1, '男'), (2, '保密'))    )    age = models.IntegerField()    def __str__(self):        return self.nameclass Book(models.Model):    title = models.CharField(max_length=32)    price = models.DecimalField(max_digits=5, decimal_places=2)  # 0~999.99    publish_date = models.DateField()    publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE)    authors = models.ManyToManyField(to="Author")    def __str__(self):        return self.title
  1. ModelForm类:
from django import formsfrom app01 import modelsclass BookModelForm(forms.ModelForm):    class Meta:        # 告诉Django这个form类和那个model类对应        model = models.Book        # 告诉Django这个form类里面有哪些字段        fields = "__all__"        widgets = {            "publish_date": forms.widgets.DateInput(                # 给日期字段添加日期类型                attrs={"type": "date"}            )        }        labels = {            "title": "书名",            "price": "价格",            "publish_date": '出版日期',            "publisher": "出版社名称",            "authors": "作者"        }        error_messages = {            "title": {                "required": "书名不能为空"            }        }    # 通过修改类的初始化方法达到批量添加共同属性的目的    def __init__(self, *args, **kwargs):        super(BookModelForm, self).__init__(*args, **kwargs)        # for field_name in self.base_fields:        for field_name in iter(self.fields):            field = self.base_fields[field_name]            field.widget.attrs.update({                "class": "form-control",            })
  1. views 视图函数:
from django.shortcuts import render,redirectfrom app01 import modelformfrom app01 import modelsdef book_list(request):    book_list = models.Book.objects.all()    return render(request, 'book_list.html', {'book_list': book_list})def add_book(request):    if request.method == "POST":        # modelform 直接可以将从前端拿到的数据组request.POST        #当参数传给实例化的Modelform        form_obj = modelform.BookModelForm(request.POST)        # 调用is_valid()方法校验数据        if form_obj.is_valid():            # 直接保存到数据库中            form_obj.save()            return redirect("/book_list/")    modelform_obj = modelform.BookModelForm()    return render(request, 'add_book.html', {"modelform_obj": modelform_obj})def edit_book(request,pk):    book_obj = models.Book.objects.filter(id=pk).first()    if request.method == "POST":        #修改数据时,直接可以将用户数据包request.POST传进去,        #再传一个要修改的对象的示例,ModelForm就可以自动完成修改数据了。        form_obj = modelform.BookModelForm(request.POST, instance=book_obj)        if form_obj.is_valid():            form_obj.save()        return redirect("/book_list/")    # form_obj通过initial设置初始化的值,例如,图书管理系统中的编辑书籍功能,    # 点击编辑后跳转到编辑书籍页面,跳转后需要用要编辑的书籍信息填充页面对应信息。    # 不同于Form组件的是,ModelForm直接就可以传实例化的对象,而不需要将对象转化成字典的形式传。    form_obj = modelform.BookModelForm(instance=book_obj)                               #locals()是将本地数据键值对的简写形式    return render(request, "edit_book.html", locals())
  1. book_list.html
    
书籍列表
添加书籍
{% for book in book_list %}
{% endfor %}
序号 id 书名 价格 出版日期 出版社 作者 操作
{ { forloop.counter }} { { book.id }} { { book.title }} { { book.price }} { { book.publish_date }} { { book.publisher }} { { book.authors.all }} 编辑
  1. add_book.html
    
添加书籍
{% csrf_token %} {% for modelform in modelform_obj %}

{

{ modelform.label }} {
{ modelform }}

{% endfor %}
  1. edit_book.html
    
添加书籍
{% csrf_token %} {% for filed in form_obj %}

{

{ filed.label }} {
{ filed }}

{% endfor %}

四、通过对Form组件和ModelForm的对比

  • ModelForm增加了Form组件和对应数据库之间的联系,进而简化了Form类的代码
  • ModelForm继承了Form组件中的所有方法的同时,简化了前端获取数据和对应数据库之间的数据对接,不需要在对数据的内容做过多的操作。

五、ModelForm中的骚操作(同Form组件)

  • 批量添加样式:
    通过重写ModelForm类的init方法来实现。
# 通过修改类的初始化方法达到批量添加共同属性的目的    def __init__(self, *args, **kwargs):        super(BookModelForm, self).__init__(*args, **kwargs)        # for field_name in self.base_fields:        for field in iter(self.fields):            self.fields[field].widget.attrs.update({                'class': 'form-control'            })

更多Django的Modelform相关内容请参考django的官方文档:

转载地址:http://pbjoo.baihongyu.com/

你可能感兴趣的文章
怎么在Beyond Compare中插入表格数据
查看>>
JSONP
查看>>
【漏洞预警】OpenSSL 远程拒绝服务漏洞
查看>>
成本管理之(成本控制)
查看>>
Java 反射工具类
查看>>
Java继承关系中,父类方法使用实例变量和调用实例方法的探究
查看>>
csdn账号密码
查看>>
AWS 配置 AutoScaling 实现高可用的弹性计算服务
查看>>
Ubuntu 16.04配置hive mysql db元数据
查看>>
Struts2 中的值栈的理解
查看>>
linux下IPTABLES配置详解
查看>>
使用Spring Mail 模块连接STMP服务器发送邮件
查看>>
Tomcat 下面使用软连接指向真实的上传文件夹
查看>>
批量修改日期,按日期生成文件
查看>>
Git的后悔药——重置 签出 撤消 取消跟踪
查看>>
mysql 5.5.x 解压版 安装
查看>>
设计模式之装饰模式
查看>>
64位Windows 2008/7下配置IIS+PHP出现404.17错误的解决办法
查看>>
mysql 安装使用过程中的问题与解决
查看>>
Java面试题之四 (转)
查看>>