Django之ModelForm使用

一:什么是ModelForm呢?

Model + Form ==> ModelForm。model和form的结合体,所以有以下功能:

  • 数据验证
  • 数据库操作

model有操作数据库的字段,form验证也有那几个字段,虽然耦合度降低,但是代码是有重复的。如果利用model里的字段,那是不是form里的字段就不用写了。

二:下面是一个简单是例子:

from django.db import models

class CustomerInfo(models.Model):
    """客户表"""
    name = models.CharField(max_length=64)
    contact_type_choices = ((0,‘QQ‘),(1,‘微信‘),(2,‘手机‘))
    contact_type = models.SmallIntegerField(choices=contact_type_choices)
    contact = models.CharField(max_length=64,unique=True,verbose_name="联系方式")
    source_choices = ((0,‘QQ群‘),(1,‘51CTO‘),(2,‘百度推广‘),(3,‘知乎‘),(4,‘转介绍‘),(5,‘其它‘))
    source = models.SmallIntegerField(choices=source_choices,verbose_name="客户来源")
    referral_from = models.ForeignKey("self",blank=True,null=True,verbose_name="转介绍",on_delete=models.CASCADE)
    consult_courses = models.ManyToManyField("Course",verbose_name="咨询课程")
    consult_content = models.TextField(verbose_name="咨询内容")
    status_choices = ((0, ‘未报名‘), (1, ‘已报名‘), (2, ‘已退学‘))
    status = models.SmallIntegerField(choices=status_choices,verbose_name="状态")
    consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问",on_delete=models.CASCADE)
    date = models.DateField(auto_now_add=True)
    def __str__(self):
        return self.name

models.py

from django.forms import ModelForm
from crm import models
from django import forms

class CustomerForm(ModelForm):
    class Meta:
        model = models.CustomerInfo
        fields = ‘__all__‘
        exclude = [‘consult_content‘, ‘status‘, ‘consult_courses‘]
        readonly_fields = [‘contact_type‘,‘contact‘,‘consultant‘,‘referral_from‘,‘source‘]   #并不是真正的设置可读模式,而是用于自定制

    def __new__(cls, *args, **kwargs):      # cls 就是实例(self)
        for field_name in cls.base_fields:
            field_obj = cls.base_fields[field_name]
            field_obj.widget.attrs.update({‘class‘:‘form-control‘})
            if field_name in cls.Meta.readonly_fields:
                field_obj.widget.attrs.update({‘disabled‘:‘true‘})
                # print(cls.Meta)
        # print(cls.Meta.exclude)
        return ModelForm.__new__(cls)

    def clean(self):
        """对数据进行验证,此方法需要在form.is_valid()后才能生效"""
        # print("cleaned_dtat:", self.cleaned_data)
        if self.errors:  # 表单级别的错误
            raise forms.ValidationError(("Please fix errors before re-submit."))
        for field in self.Meta.readonly_fields:
            old_field_val = getattr(self.instance,field)
            new_form_val = self.cleaned_data[field]
            if old_field_val != new_form_val:
                self.add_error(field,"Readonly Field: field should be ‘{value}‘ ,not ‘{new_value}‘ ".                                         format(**{‘value‘:old_field_val,‘new_value‘:new_form_val}))

forms

def enrollment(request,enrollment_id):
    """②学员确认信息"""
    customer_form = forms.CustomerForm(instance=enrollment_obj.customer)

    if request.method == "POST":
        customer_form = forms.CustomerForm(instance=enrollment_obj.customer,data=request.POST)
        if customer_form.is_valid():
            customer_form.save()
            return HttpResponse(‘合同正在审核中,请等候...‘)

    return render(request,‘crm/enrollment.html‘,locals())

views

注意我们如何在POST和GET情况下传递实例(instance)。

三、Meta的作用:

  • ModelForm 通过 Meta 把 db.Field 自动转化为 forms.Field,其中涉及到几步转化
  • validators 不变
  • 添加 widget 属性,即前端的渲染方式
  • 修改 Model 包含的字段,通过 fields 来拿指定字段或者通过 exclude 来排除指定字段
  • 修改错误信息

class Meta:
        model = models.UserInfo
        fields = ‘__all__‘
        # fields =  [‘username‘,‘email‘]
        # exclude = [‘username‘]
        labels = {
            ‘username‘: ‘用户名‘,
            ‘email‘: ‘邮箱‘,
        }
        help_texts = {
            ‘username‘: ‘...‘
        }
        widgets = {
            ‘username‘: Fwidgets.Textarea(attrs={‘class‘: ‘c1‘})
        }
        error_messages = {
            ‘__all__‘:{

            },
            ‘email‘: {
                ‘required‘: ‘邮箱不能为空‘,
                ‘invalid‘: ‘邮箱格式错误..‘,
            }
        }
        field_classes = {
            # ‘email‘: Ffields.URLField
        }

        # localized_fields=(‘ctime‘,)

Meta的另一个例子

原文地址:https://www.cnblogs.com/ray-h/p/10415269.html

时间: 2024-10-16 01:03:54

Django之ModelForm使用的相关文章

Django之ModelForm组件

1.Django之ModelForm组件 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信息 help_texts=None, # 帮助提示信息 widgets=None, # 自定义插件 error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIE

Django(十四)课程机构列表页数据展示,Django的modelform,关于urls的重新分发

关于urls的重新分发: 如果所有url都配置在根路径的urls.py里,会特别多,而且也不易于修改,Django框架里支持urls的重新分发: 1.在根路径的urls配置上: PS:namespace是定义命名空间,比如下面这种配置, urlpatterns = [ #课程机构url配置,验证码,每个app可以书写自己的url,然后通过include进来 url(r'^org/', include('oraganization.urls',namespace="org")), ] 2

Django的ModelForm简单用法

Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分别定义Form类和Model类会比较麻烦,最简单的方式就是通过Model来生成一个Form类,Django内置的ModelForm就是为此而生的.下面以一个简单的例子来说明它的简单用法. 基本需求 收集用户的日本报名信息 其中JLPT的日语等级分为N1,N2,N3,N4,N5:所以需要一个选择器. 用户需要手动输入姓名,因此需要一个输入框. 在Project中新建一个app $ python

Django的ModelForm

基于django.forms.ModelForm:与模型类绑定的Form 先定义一个ModelForm类,继承ModelForm类 from django.forms import ModelForm class MyModelForm(ModelForm): class Meta: model=models.UserInfo fields="__all__" 修改视图函数reg def reg(request): if request.method=="POST"

Django之modelform

在django中内置了form类和model类,当页面中的form值和model字段值完全一样时,此时可以通过model生成一个完全一样的form,Django中的modelForm就因此而生. 目标: 定义Author表,通过modelform提交数据到数据库 创建工程及app python django-admin.py startproject formstudy cd formstudy python manager.py startapp study 编辑models.py from

Django的ModelForm组件

创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import models class 类名(ModelForm): class Meta: model = models.表名 #models中的表名 fields="__all__", # 字段 exclude=None, # 排除字段 widgets=None, # 自定义插件 error_message

Django之ModelForm(一)

要说ModelForm,那就先说Form吧! 先给出一个Form示例: models.py from django.db import models class UserType(models.Model): caption=models.CharField(max_length=32) class UserGroup(models.Model): name=models.CharField(max_length=32) class UserInfo(models.Model): usernam

[django]django的modelform处理数据

django的form处理数据 1.生成html 2.验证数据合法性 3.直接存库 定义1个form class BlogPost(models.Model): title = models.CharField(max_length=150) body = models.TextField() timestamp = models.DateTimeField() 以前是这样的 class BlogPostForm(forms.Form): title = forms.CharField(max_

Django组件-ModelForm

模型表单ModelForm 一.基本用法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 from django import f