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属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...
随机推荐
- Git 命令行解决冲突
git add filename 将本地工作区文件加入缓存区 git commit filename -m '提交文件注释' git status 查看当前工作区状态 git fetch ori ...
- struts2的Action中使用spring的@Transactional注解事务出错
1.在Struts2使用的是spring管理对象. 使用spring的注解式事务配置, 在action的方法中直接使用事务遇到的问题. public class testAction extends ...
- 使用yum命令出错:SyntaxError: invalid syntax 由于用户取消而退出
详见: https://blog.csdn.net/qq_24880013/article/details/90731617 必须修改的两个yum配置文件: 因为yum使用python2,因此替换为p ...
- Cogs 728. [网络流24题] 最小路径覆盖问题
[网络流24题] 最小路径覆盖问题 ★★☆ 输入文件:path3.in 输出文件:path3.out 评测插件 时间限制:1 s 内存限制:128 MB 算法实现题8-3 最小路径覆盖问题(习题8-1 ...
- python录音程序
# -*- coding: utf-8 -*- # @Time : 18-10-16 下午12:20 # @Author : Felix Wang import pyaudio import nump ...
- Appium环境搭建(win/mac)
课程使用Windows+Android虚拟机, 建议使用Windows系统学习课程, 如使用Mac系统, 请另外准备一台Andorid手机 Windows系统Appium环境搭建 安装JDK并配置环境 ...
- 2017 ZSTU寒假排位赛 #6
题目链接:https://vjudge.net/contest/149212#overview. A题,水题,略过. B题,水题,读清题意即可. C题,数学题,如果把x表示成x=nb+m,则k=n/m ...
- Ubuntu 16.04 一键安装P4开发环境记录
写在最前 P4开发环境安装可采用陈翔同学的一键安装脚本:p4Installer p4c-bm是P4-14的编译器,p4c是现在主流P4-16的编译器,bmv2是支持P4运行的软件交换机 系统环境 在安 ...
- vue 循环加载动态组件以及传值
今天遇到一个需求,某个页面是个动态页面,由多个子组件构成. 之前我们的做法是将N个需要的组件import进主页面,然后引用一下即可.但是现在遇到的问题是, 这个动态页面存在多个业务,有的业务需要某几个 ...
- pom标签大全
[原文链接]:Maven POM | 菜鸟教程 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...