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. CSS3 -- 弹性盒

    新版弹性盒 兼容到IE10及以上 flex小游戏 display: flex; 设置为弹性盒(父元素添加) flex-direction 用来来确定主轴的方向,从而确定基本的项目排列方向. 参数 说明 ...

  2. service worker在移动端H5项目的应用

    1. PWA和Service Worker的关系 PWA (Progressive Web Apps) 不是一项技术,也不是一个框架,我们可以把她理解为一种模式,一种通过应用一些技术将 Web App ...

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

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

  4. filebeat configure

    docker run -d --rm -v ./filebeat.yml:/usr/share/filebeat/filebeat.yml -v /var/log:/var/log  docker.e ...

  5. BZOJ 3065 带插入区间K小值 (替罪羊树套线段树)

    毒瘤题.参考抄自博客:hzwer 第一次写替罪羊树,完全是照着题解写的,发现这玩意儿好强啊,不用旋转每次都重构还能nlognnlognnlogn. 还有外面二分和里面线段树的值域一样,那么r = mi ...

  6. 题解 [SDOI2010] 大陆争霸

    题面 解析 这题似乎不是那么难啊 首先,显而易见, 如果要摧毁一个城市,必须要满足两个条件: 机器人摧毁了保护它的城市. 机器人到达了这个城市. 而这两个条件可以同时进行(毕竟有无数机器人) 那么显然 ...

  7. ueditor上粘贴从word中copy的图片和文字

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,找到UM ...

  8. 「CF724G」Xor-matic Number of the Graph「线性基」

    题意 求所有点对\(u,v\),\(u\)到\(v\)所有不同的异或路径的异或值之和,对\(10^9+7\)取模 题解 求出一个dfs树,那么\(u\)到\(v\)的路径一定是树上路径异或一些环.这些 ...

  9. Django基础之Session

    1. Session的由来 Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的 ...

  10. python中selenium操作下拉滚动条方法

    场景:在当前显示的页面元素不可见,拖动下拉条后元素就出来了. 解决方法: 在python中有几种方法解决这种问题,简单介绍下,给需要的人: 方法一)使用js脚本直接操作,方法如下: #将页面滚动条拖到 ...