Django 中的FormModelForm

Posted shiqi17

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 中的FormModelForm相关的知识,希望对你有一定的参考价值。

一、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为字段名

以上是关于Django 中的FormModelForm的主要内容,如果未能解决你的问题,请参考以下文章

Python入门自学进阶-Web框架——18FormModelForm

关于FormModelForm的一些操作(持续更新)

django中的中间件机制和执行顺序

在并行位片代码中实现快速计数器

背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素(代码片

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | dvmDexFileOpenPartial | dexFileParse | 脱壳点 | 获取 dex 文件在内存中的首地址 )(代码片