ModelForm基本使用
介绍
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基本使用的更多相关文章
- 【Django】--ModelForm组件
ModelForm a.class Meta: model,#对应Model的 fields=None,#字段 exclude=None,#排除字段 labels=None,#提示信息 help_te ...
- Django Form and Modelform Admin定义 高级查询)
Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...
- Django ModelForm and Form
django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form 基于dj ...
- Django: ModelForm中Meta的fields等成员介绍
class MyForm(forms.ModelForm): realname = forms.CharField() phone = forms.CharField() class Meta: mo ...
- Django中ModelForm应用
Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...
- Django中使用ModelForm实现Admin功能
接上一篇<Django中使用Bootstrap> ModelForm 可以将数据库中的信息展示在一个表中,因此我们在查询数据库信息时可以使用ModelForm在前端展示查询到的信息. 在上 ...
- django Modelform
前言: 为什么要用form去验证呢? 我们提交的是form表单,在看前端源码时如果检查到POST URL及我们提交的字段,如果没有验证我们是否可以直接POST数据到URL,后台并没有进行校验,直接处理 ...
- ModelForm
这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,对,你没猜错,相信自己的英语水平. 先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一 ...
- Django的ModelForm组件
创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...
- Django ModelForm修改默认的控件属性
Django 中利用ModelForm 可以快速地利用数据库对应的Model 子类来自动创建对应表单. 例如: from django.db import models from django.for ...
随机推荐
- Netty学习--第二章 BIO的模型详解
一.什么是阻塞.非阻塞.同步.异步 我们以A线程调用B线程的过程例子来讲解这四个概念 在一个程序里,A调用B了,此时如果是 同步: A必须等待B返回结果后,才能继续执行,但是在这期间A会一直监控B的返 ...
- Node.js企业开发:应用场景
要想用Node.js首先需要知道它到底是什么, 有哪些优缺点. 然后我们才能知道到底 Node.js 适合哪些应用场景. Node.js 维基百科:“Node.js 是谷歌 V8 引擎.libuv平台 ...
- vuex使用方法
vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性.比如:我们有几个页面 ...
- TodoList案例
我们今天模仿ToDoList进行一个简单的增,删,改,查的操作 可参考官网 http://www.todolist.cn/ 下边直接上代码 import React from 'react'; cl ...
- MongoDB之自动启动服务
安装详细步骤请点我 为了能让NoSQLBooster for MongoDB连接的时候不报错,将mongodb添加到系统服务中. 在C:\Program Files\MongoDB\Server\3. ...
- Vue中 axios+QS 插件往后台传参
之前用Vue+element写了一个后台管理系统,在登录时使用axios请求数据传参时无法正常的获取数据.发现原因是传递参数要将参数序列化.这里使用了qs插件: 简单来说,qs 是一个增加了一些安全性 ...
- [洛谷P2567] SCOI2010 幸运数字
问题描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是&quo ...
- 【leetcode】1144. Decrease Elements To Make Array Zigzag
题目如下: Given an array nums of integers, a move consists of choosing any element and decreasing it by ...
- mysql IN操作符 语法
mysql IN操作符 语法 作用:在 WHERE 子句中规定多个值.深圳大理石平台 语法:SELECT column_name(s) FROM table_name WHERE column_nam ...
- 数位dp浅谈(hdu3555)
数位dp简介: 数位dp常用于求区间内某些特殊(常关于数字各个数位上的值)数字(比如要求数字含62,49): 常用解法: 数位dp常用记忆化搜索或递推来实现: 由于记忆化搜索比较好写再加上博主比较蒟, ...