介绍

Django提供Form和ModelForm两种表单验证方式。相比较Form,ModelForm可以直接与与数据库表相关联,不需要像Form那样需要手动逐一字段添加表单验证的字段。且可以随意选择需要验证的表单字段。

ModelForm使用方法

新建ModelForm

其中:

model 是需要操作的数据库表;

fields是需要验证的字段,如果需要数据库表所有字段可以使用fields="__all__"

widgets是插件,设置字段的输入方式及设置使用bootstrap时所需要的样式(有更好的实现方式);

# rbac/forms/role.py
from django import forms
from rbac import models

class RoleModelForm(forms.ModelForm):
    """
    角色操作表单
    """
    class Meta:
        model = models.Role
        fields = ["title", ]
        widgets = {
            "title": forms.TextInput(attrs={"class": "form-control"})
        }

视图函数中使用ModelForm

视图函数中实例化RoleModelForm()对象并使用,

增加

选择要验证的数据:form = RoleModelForm(data=request.POST)

验证表单数据:form.is_valid()

保存数据: form.save()

def role_add(request):

    if request.method == "GET":
        form = RoleModelForm()
        return render(request, "rbac/change.html", {"form": form})
    form = RoleModelForm(data=request.POST)
    if form.is_valid():
        form.save()
        return redirect(reverse("rbac:role_list"))
    return render(request, "rbac/change.html", {"form": form})
编辑

编辑时默认显示初始值:form = RoleModelForm(instance=role_obj)

选择要验证并编辑的数据:form = RoleModelForm(instance=role_obj, data=request.POST)

def role_edit(request, pk):
    role_obj = models.Role.objects.filter(pk=pk).first()
    if not role_obj:
        return HttpResponse("要修改的数据不存在,请重新选择")
    if request.method == "GET":
        form = RoleModelForm(instance=role_obj)
        return render(request, "rbac/change.html", {"form": form})
    form = RoleModelForm(instance=role_obj, data=request.POST)
    if form.is_valid():
        form.save()
        return redirect(reverse("rbac:role_list"))
    return render(request, "rbac/change.html", {"form": form})
字段的增或减

增加(额外新增数据库表中不存在的字段):

class UserAddModelForm(forms.ModelForm):
    confirm_password = forms.CharField(label="确认密码")
    class Meta:
        model = models.UserInfo
        fields = ["name", "email", "password", "confirm_password"]

减少(直接添加不需要验证的字段):exclude = ["password"]

class UserEditModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo
        exclude = ["password"]
不显示字段保存默认值

某种场景下需要页面不显示某个字段,但是在数据保存到数据库之前form.save()

需要对不显示的字段手动设置默认值,此时需要使用form.instance

def permission_add(request, sid):
    ...
    form = PermissionModelForm(data=request.POST)
    if form.is_valid():
        p_obj = models.Permission.objects.filter(pk=sid).first()
        # pid是FK,自关联,此处需要赋值实例对象
        form.instance.pid = permission_obj
        form.save()
        ...
字段增加Bootstrap样式

单独添加:手动为每个字段添加widgets插件

class Meta:
        ...
        widgets = {
            "title": forms.TextInput(attrs={"class": "form-control"})
        }

批量添加:重写父类init方法,循环添加

class UserEditModelForm(forms.ModelForm):
    class Meta:
        ...
    def __init__(self, *args, **kwargs):
        super(UserEditModelForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs["class"] = "form-control"
字段密文显示

两种方式:数据库表中的字段,数据库表外的新增字段

class UserAddModelForm(forms.ModelForm):
    confirm_password = forms.CharField(label="确认密码", widget=forms.PasswordInput()

    class Meta:
        model = models.UserInfo
        fields = ["name", "email", "password", "confirm_password"]
        widgets = {
            "password": forms.PasswordInput(),
        }
自定制错误信息提示

1)英文变中文可以设置配置文件settings.py 中的LANGUAGE_CODE = 'zh-hans'

2)显示格式自定制可增加插件error_messages

class Meta:
    model = models.UserInfo
    fields = ["name", "email", "password", "confirm_password"]
    error_messages = {
        "name": {"required": "用户名不能为空"}
    }

ModelForm基本使用的更多相关文章

  1. 【Django】--ModelForm组件

    ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...

  2. Django Form and Modelform Admin定义 高级查询)

    Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...

  3. Django ModelForm and Form

    django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form 基于dj ...

  4. Django: ModelForm中Meta的fields等成员介绍

    class MyForm(forms.ModelForm): realname = forms.CharField() phone = forms.CharField() class Meta: mo ...

  5. Django中ModelForm应用

    Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...

  6. Django中使用ModelForm实现Admin功能

    接上一篇<Django中使用Bootstrap> ModelForm 可以将数据库中的信息展示在一个表中,因此我们在查询数据库信息时可以使用ModelForm在前端展示查询到的信息. 在上 ...

  7. django Modelform

    前言: 为什么要用form去验证呢? 我们提交的是form表单,在看前端源码时如果检查到POST URL及我们提交的字段,如果没有验证我们是否可以直接POST数据到URL,后台并没有进行校验,直接处理 ...

  8. ModelForm

    这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,对,你没猜错,相信自己的英语水平. 先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一 ...

  9. Django的ModelForm组件

    创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...

  10. Django ModelForm修改默认的控件属性

    Django 中利用ModelForm 可以快速地利用数据库对应的Model 子类来自动创建对应表单. 例如: from django.db import models from django.for ...

随机推荐

  1. 微信公众号接口类(PHP版本)

    [项目需求] 通过微信提供的接口,实现微信公众号与后端的应用程序数据交互.消息响应等功能. [项目疑难点] 理解接口工作方式,统一接口API,响应速度.安全性等   [代码举例]   WeixinAp ...

  2. bzoj4530 [Bjoi2014]大融合 子树信息 LCT

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4530/ 题解 想要求出一条边的负载那么就是要求出一个点为根的时候的另一个点的子树大小. 又因为 ...

  3. 【SaltStack官方版】—— Events&Reactor系统—EVENT SYSTEM

    Events&Reactor系统 EVENT SYSTEM The Salt Event System is used to fire off events enabling third pa ...

  4. postman—UI测试

    思路 发送请求去拿到网站的响应->html 解析HTML标签,判断一些元素是否显示 目的 快速检查UI是否正确 测试地址 http://www.itest.info/courses 我们接下来要 ...

  5. scoket、TCP、UDP、WebService选型

    抱着去转型产品经理的方向去面试了一家公司,面试完很惭愧,不过见到了人事我也很意外,因为其实表现也没那么好,不过在此谈谈我的感受. 1.有3轮,前2轮都是先让我做自我介绍(我都说的很干脆,直接哪年毕业, ...

  6. 前端node面试题之---对比JS和NodeJS的区别

    区别: 1.JS运行在浏览器端,用于用户的交互效果,NodeJS运行在服务器端,用于服务器的操作,例如,Web服务器创建,数据库的操作,文件的操作等 2.JS运行在浏览器端,存在多个JS解释器,存在兼 ...

  7. C#项目类型分三种,Dos(控制台),c/s(客户端与服务器),b/s(浏览器/服务器)

  8. 父页面和iframe之间的通信(操作和传值问题)

    一.jq实现iframe父页面与子页面传值与方法调用 1.值操作 (1)父页面获取子页面的值 $('iframe的id').contents().find(子页面的id).text(); (2)子页面 ...

  9. RedisTemplate访问Redis数据结构(三)——Hash

    HashOperations提供一系列方法操作hash.首先初始化spring工厂获得redisTemplate和opsForHash private RedisTemplate<String, ...

  10. 配置maven方法

    配置maven方法 1.官网下载maven, http://maven.apache.org/download.cgi Only the binaries are required, so look ...