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的更多相关文章

  1. 6月28日 Django form组件 和 modelform组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  2. Django——form组件和ModelForm

    一.原生form实现书城增删改查 1.构建模型并完成数据库迁移 (1)构建书城模型 from django.db import models # Create your models here. # ...

  3. Django框架11 /form组件、modelForm组件

    Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...

  4. django Form组件

    django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...

  5. 9.24 Django Form组件

    2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...

  6. python 终极篇 --- form组件 与 modelForm

                                                           form组件                                       ...

  7. form组件之modelForm

    modelForm的使用及参数设置 从modelForm这个名字就能看出来,这个form是和模型类model有知己诶关联的,还是以数和出版社的模型来说明: models.py(模型) from dja ...

  8. Django—Form组件

    Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比 ...

  9. django form组件 cookies,session

    django form组件 渲染标签  就是组件里面的字段在前端展示叫做渲染标签 校验数据  用户输入的数据提交给后端组件叫做校验数据 forms组件中定义的字段都是必须传值的(required=Tr ...

  10. Python Web框架篇:Django Form组件

    Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...

随机推荐

  1. (四)关于java.lang.IllegalMonitorStateException异常说明

    1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...

  2. docker并不能把部署的工作「减少为0」,比较好的情况下是「基本减少为1」

    很多人说docker改变了运维世界,这句话是从群体角度来说的,是统计学意义上的改变,像mysql,python这样被大规模使用的基础应用,docker化之后为整个群体所节省的时间是非常巨大的. 有人可 ...

  3. PHP实现省市区关键词搜索邮编

    前两天做了一个项目, 其中有一个需求是根据用户输入的关键词查询邮编. 最开始设计的数据库结构是省市区分为三个字段, province, city, area, 但是在写代码实现的过程中发现, 用户只输 ...

  4. PHP mysqli_get_charset() 函数

    mysqli_get_charset() 函数返回字符集对象. <?php $con=mysqli_connect("localhost","my_user&quo ...

  5. 路由器配置——RIP路由

    一.实验目的:用rip路由实现全网互通 二.拓扑图: 三.具体步骤配置 (1)R1路由器配置 Router>enable  --进入特权模式Router#configure terminal   ...

  6. jQuery系列(十):事件对象

    1.事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. (1)什么时候会产生Event 对象呢? 例如: 当用户单击某个元素的时候,我们给 ...

  7. Linux网络命令——ifconfig、ifup、ifdown

    这三个命令的用途都是启动网络接口,不过,ifup 与 ifdown 仅就 /etc/sysconfig/network- scripts 内的 ifcfg-ethx(x为数字)进行启动或关闭的操作,并 ...

  8. 简易的学生成绩管理系统(C++实现)

    最近浅显的学习了C++的基础知识,想来练练手,于是就用单链表写了最经典的小项目,存粹学习,所以就在控制台下写了,写的有点简陋,码了大概400多行. 下面上代码: #include <cstdli ...

  9. 栈的数组和链表实现(Java实现)

    我以前用JavaScript写过栈和队列,这里初学Java,于是想来实现栈,基于数组和链表. 下面上代码: import java.io.*; //用接口来存放需要的所有操作 interface st ...

  10. docker下的images 保存和导出

    由于迁移测试环境,所以部署的的docker镜像某一些需要迁移到另外一台服务器上面去.. 我是用 docker save -o registry.tar registry 来把相应需要导出的images ...