Django Form ModelForm modelfromset
Django forms 组件
Form
form表单完成的事情
- 提供input可以提交数据
- 对提交的数据进行校验
- 提供错误提示
定义form组件
from django import forms class RegForm(forms.Form):
user = forms.CharField(label='用户名') # input 输入框
pwd = forms.CharField(label='密码') # label 提示 <label> 标签值
使用 form 组件
视图中:form_obj = RegForm() # 实例化form对象
return render(request, 'reg2.html', {'form_obj': form_obj})
模板中:
form 标签加上 novalidate 前端不进行校验{{ form_obj.as_p }} ——》 生成所有的p标签 label input
{{ form_obj.errors }} ——》所有字段的错误
{{ form_obj.user }} ——》 该字段的input框
{{ form_obj.user.label }} ——》 该字段的label 中文提示
{{ form_obj.user.id_for_label }} ——》 该字段的id
{{ form_obj.user.errors }} ——》 该字段的所有的错误信息
{{ form_obj.user.errors.0 }} ——》 该字段的第一个的错误信息
{{ form_obj.get_字段名_display }} ——》 该字段含有 chices 的 值
字段:
forms.CharField(label='用户名') # input 输入框
forms.ChoiceField(label='用户名') # select框 单选
forms.MultipleChoiceField(label='用户名') # 多选框
forms.EmailField(label='用户名') # Email 输入框 自动校验 email 格式
字段的参数:
required=True, 是否允许为空
widget=None, HTML插件 min_length=8 最小长度
max_length=16 最大长度 label=None, 用于生成Label标签或显示内容 initial=None, 初始值 error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错 误','min_length':'用户名位数不足'}
validators=[], 自定义验证规则 func函数 == disabled=False, 是否可以编辑 choices=((1,'男'),(2,'女'),(3,'未知'),) 多选框 或单选框的 选项 widgte=forms.passwordInput() 改为密码输入框
widgte=forms.SelectMultiple 改为多选框
widgte=forms.RadioSelect() 改为单选列表
widgte=forms.ChectboxSelectMutiple 改为密码输入框
校验:
- 内置校验
required=True,min_length=8,max_length=12, ........ - 自定义的校验(自定义校验器)
定义函数
from django.core.exceptions import ValidationError
def check(value):
if '苍老师' in value:
raise ValidationError('敏感词汇,不符合社会职业核心价值观') # 使用 添加到 自定义验证规则的 参数中
validators=[check]
正则 匹配 re
from django.core.validators import RegexValidator
# 手机号匹配规则
validators=[RegexValidator(r'^1[3-9]\d{9}$', '格式不正确')]
钩子校验: (Hook)
1.局部钩子
clean_字段名(self,)
通过校验 返回通过校验的值
不通过 抛出异常 ValidationErrordef clean_user(self):
value = self.cleaned_data.get('user')
if 'cangjingkong' in value:
raise ValidationError('不符合社会职业核心价值观')
return value
2.全局钩子
clean(self,)
self.add_error(name,'错误提示')
通过校验 返回通过校验self.cleaned_data
不通过 抛出异常 ValidationErrordef clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd') if pwd != re_pwd:
self.add_error('re_pwd', '两次密码不一致!!@!') # 添加错误信息
raise ValidationError('两次密码不一致') # 抛出异常 return self.cleaned_data
流程:
form_obj = RegForm()
form_obj = RegForm(request.POST)
form_obj .save() 保存或 更改数据
form_obj.is_valid() 是否通过校验
form_obj.cleaned_data 经过校验的数据
return render(request,'reg.html',{'form_obj ':form_obj })FBV 写法
# 创建 和 修改 客户的方法 FBV
def customer_edit(request, pk=None):
''' 创建 和 修改 客户的方法 '''
# 通过分组 参数 的 id 获取 要修改的对象
cus_obj = models.Customer.objects.filter(pk=pk).first()
# 吧要修改 的对象通过 instance 传入form组件中
form_obj = CustomerForm(instance=cus_obj)
if request.method == 'POST':
form_obj = CustomerForm(request.POST, instance=cus_obj)
if form_obj.is_valid():
# 如果 instance 有对象则是修改数据 没有就是 新增数据
form_obj.save() return redirect(rev_url(request, 'show:public_customer')) return render(request, "form_edit.html", {'form_obj': form_obj, 'title': "修改用户" if cus_obj else '添加用户'})
CBV 写法
class Change_user(View): CBV def get(self, request):
'''显示用户信息 get 请求'''
# 获取个人用户的对象
user = UserProfileForm(instance=request.user_object) return render(request, 'form_edit.html', {'form_obj': user, 'title': '用户信息'}) def post(self, request):
''' 修改个人数据 '''
user = UserProfileForm(request.POST, instance=request.user_object)
if user.is_valid():
print(user.cleaned_data)
user.save() # 修改数据
return self.get(request) # 调用自己的 get 方法 展示页面
return redirect(reverse('show:change_user'))
- 内置校验
ModelForm
from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from crm import models
import hashlib
class BootstrapForm(forms.ModelForm):
# 重写__init__方法
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
# 给所有的字段 添加 更新 属性 class="form-control"
# print(field)
field.widget.attrs.update({"class": "form-control", })
# 给单个 标签 设置 属性
self.fields['course'].widget.attrs.update({"class": "", })
# 自定义的 input 框 创建 确认密码的字段
password = forms.CharField(label='密码', widget=forms.PasswordInput(), min_length=6, )
# attrs = {'placeholder': '数字 字母 下划线 下划线组成 最少6位'}
re_password = forms.CharField(label='确认密码', widget=forms.PasswordInput(), min_length=6, )
class Meta:
model = models.UserProfile # 要 修改的model
fields = "__all__" # 显示所有字段
# fields = ['username', 'password'] 显示 指定字段
exclude = ['is_active'] # 不显示的 字段 不包含
# 所有的显示 中文 提示 作用不到 自己添加的字段
labels = {
'username': '用户名emil',
'password': '密码',
'department': '部门'
}
# 所有的 widgets 参数
widgets = {
'password': forms.PasswordInput(),
}
# 所有的错误信息
error_messages = {
'username': {
'required': "不能为空",
'invalid': "格式不正确"
},
'name': {
'required': "不能为空",
'invalid': "格式不正确"
}
}
modelForm 中 获取 关联的所有对象 一对多
不同字段的显示
普通字段
{{ customer.qq }}含有choices字段
{{ customer.get_sex_display }} # get_字段名_display() 方法 模板中不加()其他字段
多对多、特殊显示,在model中定义方法。def show_classes(self):
return ' | '.join([str(i) for i in self.class_list.all()]) def show_status(self):
color_dict = {
'signed': 'green',
'unregistered': 'red',
'studying': 'blue',
'paid_in_full': 'yellow',
} return '<span style="background-color: {};color: white;padding: 3px">{}</span>'.format(
color_dict.get(self.status),
self.get_status_display())
modelfromset 可修改的 form 在视图中使用
from django.forms import modelformset_factory
form_set_obj = modelformset_factory(models.StudyRecord, StudyRecordForm, extra=0)
study_record_list = models.StudyRecord.objects.filter(pk=id)
form_obj = form_set_obj(queryset=study_record_list)
if request.method == 'POST':
form_obj = form_set_obj(request.POST, queryset=study_record_list)
if form_obj.is_valid():
form_obj.save()
return redirect(-----)
return render(request, '------.html', {'form_obj': form_obj})
模板中使用
{{ form.instance }} 模板中使用原始的 form表单内容
注意 不然报错
form 表单中 要有 {{ form_obj.management_form }}
每一行中要有 {{ form.id }}
Django Form ModelForm modelfromset的更多相关文章
- Django Form&ModelForm
ModelForm: 首先导入所需模块 from django.forms import ModelFormfrom django.forms import widgets as form_widge ...
- Django Form和ModelForm组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django之路12——form modelform formset modelformset的各种用法
首先上结论: form适用于对单个表单的操作,并且需要对每个字段的验证规则自定义. modelform:适用于对用户提交的单个表单操作,字段可以用model中的表的字段来作为验证规则,适用于快速的 ...
- Django - Form和ModelForm
[TOC] 一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 ...
- Django Form and ModelForm
Form介绍 在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输 ...
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django中ModelForm应用
Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...
- Django form模块使用心得
最近用Django 写了一个网站,现在来分享一下对Django form 的一些心得. 一,创建一个表单 创建一个Form表单有两种方式: 第一种方式是继承于forms.Form,的一个子类,通过在f ...
- Python Web框架篇:Django Form组件
Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...
随机推荐
- IP白名单添加了当前IP,获取access_token时依然报出错误码40164的坑
开发公众号网页时,想要调用微信API接口,令人无奈的是,想要调用各接口都需使用access_token,于是,获取access_token的征途开始了…… 1.开发者基本配置 (1) 公众平台官网登录 ...
- [NOI 2015]品酒大会
Description 题库链接 \(n\) 杯鸡尾酒排成一行,其中第 \(i\) 杯酒 (\(1 \leq i \leq n\)) 被贴上了一个标签 \(s_i\),每个标签都是 \(26\) 个小 ...
- elasticsearch6.7 05. Document APIs(1)data replication model
data replication model 本节首先简要介绍Elasticsearch的data replication model,然后详细描述以下CRUD api: 1.读写文档(Reading ...
- 设计模式之备忘录模式(Memento )
当我们在实际应用中需要提供撤销机制,当一个对象可能需要再后续操作中恢复其内部状态时,就需要使用备忘录模式.其本质就是对象的序列化和反序列化的过程,支持回滚操作. 作用 在不破坏封装性的前提下,捕获一个 ...
- 【23】备忘录模式(Memento Pattern)
一.引言 在上一篇博文分享了访问者模式,访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而今天要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起 ...
- 为什么90%的CTO 都做不好绩效管理
十多年从业经历,从 2001 年开始带团队到现在,我几乎经历过所有的 IT 角色.2010 年,我随创始团队筹建国美在线至今,经历了从几百单到现在日均百万订单,从只有家电品类到现在全品类.金融.大 ...
- Nginx + 阿里云SSL + tomcat 实现https访问代理
第一步:阿里云申请云盾证书服务 第二步:下载证书 第三步:修改Nginx配置 1. 证书文件214033834890360.pem,包含两段内容,请不要删除任何一段内容. 2. 如果是证书系统创建的C ...
- 【Mybatis】一对一实例
①创建数据库和表,数据库为mytest,表为father和child DROP TABLE IF EXISTS child; DROP TABLE IF EXISTS father; CREATE T ...
- 理解微信小程序Wepy框架的三个事件交互$broadcast,$emit,$invoke
$broadcast: $broadcast事件是由父组件发起,所有子组件都会收到此广播事件,除非事件被手动取消.事件广播的顺序为广度优先搜索顺序,如上图,如果页面Page_Index发起一个$bro ...
- React Native中Mobx的使用
从今天开始我们来搞搞状态管理可否,这几天没怎么写博客,因为被病魔战胜了,tmd,突然的降温让我不知所措,大家最近注意安全,毕竟年底了,查的严,呸,大家注意保暖 特别声明:写该文只是写一下用MobX的思 ...