Django 中的Form、ModelForm

一、ModelForm

  • 源码
class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass):
    pass

def modelform_factory(model, form=ModelForm, fields=None, exclude=None,
                      formfield_callback=None, widgets=None, localized_fields=None,
                      labels=None, help_texts=None, error_messages=None,
                      field_classes=None):

?

1.2 实例理解

?

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re

from django import forms
from django.forms import widgets as Mwidgets
from django.forms import fields as Mfields
from django.forms import ValidationError

from cmdb import models

class UserModelForm(forms.ModelForm):

    session_checkbox = Mfields.ChoiceField(
        choices=(
            (0, "默认每次输入密码"),
            (1, "一周免登陆"),
            (4, "一个月免登陆"),
        ),
        # widget=Mwidgets.CheckboxInput
    )

    is_login = Mfields.CharField(
        label= "一年免登陆",
        widget= Mwidgets.CheckboxInput()
    )

    class Meta:
        model = models.User
        # fields = "__all__"   #所有字段都验证生成
        fields = ["name", "email", "wechat", "phone",] #从表中选出字段验证生成
        exclude = ["password", "ctime"] #除了选中的字段都验证生成

        labels = {      #前端生成 labels  给字段别名,使用中文不使用数据库字段名
            "name": "用户名:",
            "email": "邮箱:",
            "wechat": "微信",
            "phone": "手机号:"

        }
        widgets = {
            "name": Mwidgets.TextInput(attrs={"class": "c1", "value": "请输入用户名"}),
            "email": Mwidgets.Textarea(attrs={"class": "c2"})
        }

        error_messages = {
            "email": {
                "required": "邮箱必填",
                "invalid": "邮箱格式有误"
            },
            "phone": {
                "required": "电话号码为必填",
                "invalid": "手机号有误"
            }
        }

    #因为本身 ModelForm 继承了 Form
    #所以可以用 Form预留的钩子来做验证

    def clean_phone(self):
        """
        class BaseForm:
            .....
            def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
                ....
                self.is_bound = data is not None or files is not None
                self.data = {} if data is None else data
        """
        #上面为BaseForm源码, 当在 POST 方法中实例化Form 或者 ModleForm 时,requestPOST 就被传入 self.data中了
        #所以 所有字典的方法  self.data都可用了,建议使用dict.get()方式取数据
        phone_number = self.data.get("phone", None)
        if not phone_number:
            raise ValidationError("电话号不能为空")
        mobile_pattern = '^13[0-8]{1}\d{8}'
        if not re.match(mobile_pattern, str(phone_number)):
            raise ValidationError("手机号格式有误")
        return phone_number  # 将正确的 value 电话号返回去

        #以下为预留钩子源码
        #  if hasattr(self, 'clean_%s' % name):
        #  value = getattr(self, 'clean_%s' % name)()
        #  self.cleaned_data[name] = value   返回的正确值被加入到 self.cleaned_data[name] 中,name为字段名

原文地址:https://www.cnblogs.com/shiqi17/p/9665051.html

时间: 2024-10-29 19:11:21

Django 中的Form、ModelForm的相关文章

Django 框架篇(九): Django中的Form 组件

Django中的Form组件,帮我们处理了 form表单中的校验, 和错误提示的处理: 主要功能: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 使用form组件实现注册功能 1.  定义一个类, 继承django中的 forms.Form 代码实例: from django import forms # 按照Django form组件的要求自己写一个类 class RegForm(forms.Form): name = forms.CharField(label="用

转 Django中的Form

https://www.cnblogs.com/chenchao1990/p/5284237.html Form 一.使用Form Django中的Form使用时一般有两种功能: 1.生成html标签 2.验证输入内容 要想使用django提供的form,要在views里导入form模块 from django import forms 然后再定义一个类,这个类就是要在前端html页面中生成form表单中的input标签的. 1 class UserInfo(forms.Form): 2 ema

Django中的form表单

1,手写一个form表单提交数据 有input标签,让用户可以填数据 校验form表单提数据 提示错误信息 html页面代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>注册</title> </head> <body> <h1>form表单中的注册<

django中的Form和ModelForm中的问题

django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新 方法一:重写构造方法,在构造方法中重新去获取值 class UserForm(forms.Form): name=fields.CharField(label='用户名',max_length=32) email=fields.EmailField(label='邮箱') u_id=fields.ChoiceField( choice=[] ) def __init__(self,*args,**k

Django之路——form modelform formset modelformset的各种用法

首先上结论: form适用于对单个表单的操作,并且需要对每个字段的验证规则自定义. modelform:适用于对用户提交的单个表单操作,字段可以用model中的表的字段来作为验证规则,适用于快速的进行增加.修改. formset:适用于对多个表单进行操作,字段需要也可以用model中的表的字段来作为验证规则. modelfoemset:适用于对多个表单进行操作,字段需要也可以用model中的表的字段来作为验证规则,速度可能快一些(有待考证) form用法 后端代码 from django.for

django中的 form 表单操作

1. 定义   from django import forms # 定义form   class RegForm(fo rms.Form):    user = forms.CharField(label='用户名')    pwd = forms.CharField(label='密码') 2. 使用   视图中    form_obj = RegForm()    return render(request, 'register2.html', {"form_obj": form

Django中的Form表单验证

回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错误信息的字典,并会遍历类的所有属性(对应前端待验证的输入域),调用各自的验证方法,将错误信息(两类,必要与否以及格式正确与否)存入字典,并得出最终的验证结果.在使用时,需要定义继承自Form基类不同的Form类,以对应有着不同输入域的Form表单.在拿到前端给的字典前,要先初始化自定义From类,直

django中的Form

基于django.forms.Form:所有表单类的父类 基于django.forms.ModelForm:可以和模型绑定的form djangoform的最简单的实现: 在Form类中添加 class PublisherForm(forms.Form): name=forms.CharField(label="名称",error_messages={"required":"不能为空"}) address=forms.CharField(&quo

Django 中的Form表单认证

一.Form表单 ? 1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签 ? 1.2 创建表单类Form 1. 创建的类必须继承类:forms.Form 2. 字段名必须与前端表单中的名称一致(完全一样) 3. Field类是所有其他类的基类 #!/usr/bin/env python # -*- coding:utf-8 -*- import re from django import forms from d