龙空技术网

第22章 Django开发有便捷,ModelForm,合二为一

老陈说编程 134

前言:

当前朋友们对“django modelform”大体比较关心,朋友们都想要了解一些“django modelform”的相关文章。那么小编也在网络上搜集了一些对于“django modelform””的相关资讯,希望你们能喜欢,咱们一起来了解一下吧!

在定义DepartmentForm类的类型属性时,是不是感觉似曾相识?没错,那是跟models种的类型属性是一样的。

既然一样,那是否可以进行合并?答案是肯定的,用ModelForm类就可以实现。在forms.py中,定义一个DepartmentModelForm类,继承forms.ModelForm,在其内部类Meta中进行一番折腾。

22.1 合二为一

from django import formsfrom django.forms import widgetsfrom django.core.exceptions import ValidationErrorimport refrom .models import Departmentclass DepartmentModelForm(forms.ModelForm): class Meta: model = Department # 不显示exclude中指定的字段 exclude = ['createDate'] # 定义标签 labels = { 'name': '部门名称', 'leader': '负 责 人:', 'phone': '手 机 号:', 'region': '所在区域:', 'address': '办公位置:', 'longitude': '区域经度:', 'latitude': '区域纬度:', } choice = (("集团总部", "集团总部"), ("华南区域", "华南区域"), ("华北区域", "华北区域"), ("华东区域", "华东区域"),) # 定义html控件 widgets = { 'name': widgets.TextInput(attrs={"placeholder": "请输入部门名称", "class": "form-control"}), 'leader': widgets.TextInput(attrs={"placeholder": "请输入负责人", "class": "form-control"}), 'phone': widgets.NumberInput(attrs={"placeholder": "请输入手机号", "class": "form-control"}), 'region': widgets.Select(choices=choice, attrs={"class": "form-control"}), 'address': widgets.TextInput(attrs={"placeholder": "办公所在位置", "class": "form-control"}), 'longitude': widgets.NumberInput(attrs={"placeholder": "区域所在经度", "class": "form-control"}), 'latitude': widgets.NumberInput(attrs={"placeholder": "区域所在纬度", "class": "form-control"}), } # 定义错误提示信息 error_messages = { "name": { 'required': '部门名称不能为空,请输入!', 'max_length': "部门名称太长了!"}, 'leader': { 'required': '负责人不能为空,请输入!', 'max_length': '负责人名字太长了!'}, 'phone': { 'required': '手机号不能为空,请输入!'}, } # 手机号验证 def clean_phone(self): phone = str(self.cleaned_data.get('phone')) mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') if not mobile_re.match(phone): raise ValidationError('请输入正确的手机号!') return phone

DepartmentModelForm中Meta的内容定义是不是感觉似曾相识?没错,基本上可以直接从DepartmentForm拷贝过来,只是Meta更具条理性,更具可读性,它的属性选项,除了几个特有的,其他的跟Form中的含义是一样的,注意一点:自定义规则函数,不在Meta内部,而是跟它平级的。

22.2 有关Meta的属性选项一览表

既然Model有便捷,那业务逻辑(views.py)是不是也有便捷,答案是肯定的,详情请见下一节内容。

标签: #django modelform