Django-Form组件-forms.ModelForm
froms.ModelForm
具有models操作数据库字段的功能,还具有Form的功能。较Form组件而言,根据model自动生成Form。
使用注册的案例进行初步认识
# 使用ModelForm创建Form模板
from django import forms
class RegForm(forms.ModelForm):
re_password = forms.CharField(min_length=6,
widget=forms.PasswordInput(attrs={'placeholder': '确认密码', 'autocomplete': 'off'}),
label='确认密码', )
class Meta:
model = models.UserProfile
fields = '__all__'
ecclude = ['is_active', 'memo']
min_lengths = {'password': 6}
# 定义字段的widgets属性
widgets = {
'username': forms.EmailInput(attrs={'placeholder': '用户名', 'autocomplete': 'off'}),
'password': forms.PasswordInput(attrs={'placeholder': '密码', 'autocomplete': 'off'}),
'name': forms.TextInput(attrs={'placeholder': '姓名', 'autocomplete': 'off'}),
'mobile': forms.TextInput(attrs={'placeholder': '手机号', 'autocomplete': 'off'}),
}
# 定义每一个字段的labels属性
labels = {
'username': '用户名',
'password': '密码',
'name': '姓名',
'mobile': '手机号',
'department': '部门'
}
# 可以使用局部钩子
def clean_mobile(self):
phone = self.cleaned_data.get('mobile')
ret = re.match(r"^1[35678]\d{9}$", phone)
if ret:
return phone
else:
raise ValidationError('手机格式不正确')
def clean_username(self):
user = self.cleaned_data.get('username')
obj = models.UserProfile.objects.get(username=user)
if obj:
raise ValidationError('该用户已存在')
return user
# 可以定义全局钩子
def clean(self):
self._validate_unique = True # 去数据库检验唯一性
password = self.cleaned_data.get('password')
re_password = self.cleaned_data.get('re_password')
if password == re_password:
md5 = hashlib.md5()
md5.update(password.encode('utf-8'))
self.cleaned_data['password'] = md5.hexdigest()
return self.cleaned_data
self.add_error('re_password', '两次密码不一致') # 将全局的错误信息添加到字段错误列表中
raise ValidationError('两次密码不一致')
在views视图函数中进行实例化
def reg(request):
form_obj = RegForm()
if request.method == 'POST':
form_obj = RegForm(request.POST)
if form_obj.is_valid():
form_obj.save()
return redirect('app01:login')
return render(request, 'logon.html', {'form_obj': form_obj})
在htm中进行展示
<form action="" method="post">
{% csrf_token %}
<div>{# 注册账户 #}
{{ form_obj.username }} {{ form_obj.username.errors.0 }}
</div>
<div>{# 注册密码 #}
{{ form_obj.password }} {{ form_obj.password.errors.0 }}
</div>
<div>{# 密码确认 #}
{{ form_obj.re_password }} {{ form_obj.re_password.errors.0 }}
</div>
<div>{# 真实姓名 #}
{{ form_obj.name }} {{ form_obj.name.errors.0 }}
</div>
<div>{# 注册部门 #}
{{ form_obj.department }} {{ form_obj.department.errors.0 }}
</div>
<div>{# 注册手机号 #}
{{ form_obj.mobile }} {{ form_obj.mobile.errors.0 }}
</div>
<div>
{{ error }}
</div>
<button id="submit">Sign on</button>
</form>
知识点-class Meta
class Meta是一个内部类,作用是定义Form模型的特殊性质
class Meta中常用的参数有:
model = models.UserProfile # 根据一个具体的model表进行form的创建
fields = "__all__" # 字段,如果是__all__,就是表示列出所有的字段
exclude = None # 排除的字段
labels = None # 提示信息
help_texts = None # 帮助提示信息
widgets = None # 自定义插件
error_messages = None # 自定义错误信息
field_classes=None # 自定义字段类 (也可以自定义字段)
知识点-验证和其他
# views中进行写入验证
form_obj.is_valid() # 数据库保存数据之前,判断该条记录能否写入
# vies中进行保存
form_obj.save()
# 可以重写全局钩子和局部钩子
# 全局钩子中
self._validate_unique = True # 去数据库检验进行unique判断,不设置时会有唯一性异常
数据添加和修改中的应用
路由
url(r'^customer_add/', views.customer_operate,name='customer_add'),
url(r'^customer_edit/(\d+)/', views.customer_operate,name='customer_edit'),
视图函数
def customer_operate(request, pk=None):
obj = models.Customer.objects.filter(pk=pk).first()
form_obj = OperateForm(instance=obj)
if request.method == 'POST':
form_obj = OperateForm(request.POST, instance=obj)
if form_obj.is_valid():
form_obj.save() # save
next = request.GET.get('next')
if next:
return redirect(next)
return redirect('app01:mine_customer')
title = '编辑客户信息' if pk else '添加用户信息'
return render(request, 'customeroperate.html', {'form_obj': form_obj, 'title': title})
ModelForm
class BaseForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 自定义操作,循环添加class操作,当遇到MultiSelectFormField或者forms.BooleanField框时,不加class类
for name, field in self.fields.items():
# if name == 'course' # 可以直接判断字段名
if isinstance(field, (MultiSelectFormField, forms.BooleanField)):
# 判断字段类型是MultiSelectFormField, forms.BooleanField还可以根据需求继续添加到元组中,让他们的格式不接受form-control的样式
continue
# 方式一:
field.widget.attrs['class'] = 'form-control'
# 方式二:
# field.widget.attrs.update({'class': 'form-control'})
# 新增和编辑客户form组件
class OperateForm(BaseForm):
class Meta:
model = models.Customer
fields = '__all__'
html中
<form class="form-horizontal" action="" method="post" novalidate >
{% csrf_token %}
{% for customer in form_obj %}
<div class="form-group {% if customer.errors %} has-error {% endif %}">
<label for="{{customer.id_for_label}}"
class="col-sm-3 control-label {% if not customer.field.required %} not_required {% endif %}">
{{customer.label}}</label>
<div class="col-sm-4">
{{ customer }}
</div>
<p class="col-sm-4"><span>{{ customer.errors.0 }}</span></p>
</div>
{% endfor %
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">保存</button>
</div>
</div>
</form>
Django-Form组件-forms.ModelForm的更多相关文章
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django——form组件和ModelForm
一.原生form实现书城增删改查 1.构建模型并完成数据库迁移 (1)构建书城模型 from django.db import models # Create your models here. # ...
- Django框架11 /form组件、modelForm组件
Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
- 9.24 Django Form组件
2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...
- python 终极篇 --- form组件 与 modelForm
form组件 ...
- form组件之modelForm
modelForm的使用及参数设置 从modelForm这个名字就能看出来,这个form是和模型类model有知己诶关联的,还是以数和出版社的模型来说明: models.py(模型) from dja ...
- Django—Form组件
Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比 ...
- django form组件 cookies,session
django form组件 渲染标签 就是组件里面的字段在前端展示叫做渲染标签 校验数据 用户输入的数据提交给后端组件叫做校验数据 forms组件中定义的字段都是必须传值的(required=Tr ...
- Python Web框架篇:Django Form组件
Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...
随机推荐
- 单例模式(Singleton)的同步锁synchronized
单例模式,有“懒汉式”和“饿汉式”两种. 懒汉式 单例类的实例在第一次被引用时候才被初始化. public class Singleton { private static Singleton ins ...
- javascript内置对象:Date
JavaScript内置函数:Date时间<script> var today=new Date(); weeks=["日","一",& ...
- pe头
1.dos头 结构: struct _IMAGE_DOS_HEADER { WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_c ...
- CSP-S 模拟53 题解
题解: T1 u: 一看到修改这么多,但询问其实只有一个不难想到差分,但是他这个形状可以说很不规则,于是我们想到分别维护竖着的和斜着的差分,然后最后合并即可. 考场上瞎调了一波系数莫名AC,其实是维护 ...
- 图论小专题B
2 树 2.1 树的定义 一个只有\(N-1\)条边,且任意两个点连通的图叫做树.通过这样定义的树往往是一棵无根树,而我们通常会任意选定一个根节点使其变成有根树.有根树可以定义"父亲和儿子& ...
- 深度学习笔记(十三)YOLO V3 (Tensorflow)
[代码剖析] 推荐阅读! SSD 学习笔记 之前看了一遍 YOLO V3 的论文,写的挺有意思的,尴尬的是,我这鱼的记忆,看完就忘了 于是只能借助于代码,再看一遍细节了. 源码目录总览 tens ...
- 阿里云Ubuntu安装LNMP环境之Mysql
在QQ群很多朋友问阿里云服务器怎么安装LNMP环境,怎么把项目放到服务器上面去,在这里,我就从头开始教大家怎么在阿里云服务器安装LNMP环境. 在这之前,我们先要知道什么是LNMP. L: 表示的是L ...
- node中fs内置模块
Node.js内置的fs模块就是文件系统模块,负责读写文件. 和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法. 回顾一下什么是异步方法.因为JavaScript的单线程 ...
- Django从Models 10分钟定制一个Admin后台
目录 Django从Models 10分钟建立一套RestfulApi Django从Models 10分钟定制一个Admin后台 简介 Django自带一个Admin后台, 支持用户创建,权限配置和 ...
- kubernetes 的configMap和sercet配置信息
简介: 启动pod,pod启动时可以将configMap资源关联到当前pod上来,从中读一个数据c传递给pod内的容器的一个变量.任然是变量注入的方式来给容器传配置信息. 把每一个configMap当 ...