Django基础笔记3(form组件)
From组件
from django.forms import Form, fields
class loginForm(Form): # 设置规则
username = fields.CharField(max_length=16, required=True, error_messages={
'required': '要填用户名',
'max_length': '太长了'
})
passwd = fields.CharField(max_length=10, min_length=6, required=True)
使用form组件
def test(request):
if request.method == 'GET':
return render(request, 'App7/login.html')
else:
obj = loginForm(request.POST)
ret = obj.is_valid() # 自动校验,返回bool
if ret:
print(obj.cleaned_data) #返回字典类型
return HttpResponse('123')

form组件返回错误信息
def test(request):
if request.method == 'GET':
return render(request, 'App7/login.html')
else:
obj = loginForm(request.POST)
#obj=loginForm({'name':'xxx'}) #与上面一样
ret = obj.is_valid() # 自动校验,返回bool
if ret:
print(obj.cleaned_data) #返回字典类型
else:
print(obj.errors)
print(obj.errors['username'][0])#索引的方式查找相应字段的错误信息
return HttpResponse('123')
前端显示错误信息
name:<input type="text" name="username">{{ obj.errors.username.0 }}<br>
password:<input type="password" name="passwd">{{ obj.errors.passwd.0 }}<br>

利用Ajax传表单
def adjax_login(request):
ret = {'status': True, 'msg': ''}
if request.method == 'POST':
obj = loginForm(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
else:
# print(obj.errors) # 对象类型,不能直接传
ret['status'] = False
ret['msg'] = json.dumps(obj.errors, ensure_ascii=False) # 第二个参数防止中文乱码
v = json.dumps(ret, ensure_ascii=False)
return HttpResponse(v)
<form id="form1" method="post" action="./login.html">
{% csrf_token %}
name:<input type="text" name="username">
<br>
password:<input type="password" name="passwd">
<br>
<button type="submit">登录</button>
<a onclick="subForm();">提交</a>
</form>
function subForm() {
$('.error').remove()//先清除之前的错误信息
$.ajax({
url: './ajaxLogin.html',//此处也可使用别名({% url 'name' %})
type: 'POST',
data: $('#form1').serialize(), //ajax自带的处理form表单数据
dataType: 'JSON',
success: function (arg) {
if (arg.status) {
//表单格式无误
} else { //字典的key(字段名,出错的input的name) //字典的value(错误信息)
$.each(JSON.parse(arg.msg), function (index, value) {
console.log(index)
var tag = document.createElement('span')
tag.innerHTML = value[0]
tag.className = 'error'
$('#form1').find('input[name="' + index + '"]').after(tag)
})
}
}
}
)
}
效果

使用Ajax提交,页面不会刷新,用户的填写会被保留

form表单的其他字段类型限制
class testForm(Form):
email = fields.EmailField(required=True, error_messages={
'invalid': '格式错误,必须是邮箱格式' # 所有的格式错误,都是invalid
})
num = fields.IntegerField(required=True, max_value=10, min_value=10000) # int类型的field可以设置最大最小值
t1 = fields.URLField()
t2 = fields.SlugField() # 数字字母下划线
t3 = fields.DateField() # 日期
t4 = fields.RegexField() # 可自定制正则表达式
常用的正则表达式:脚本之家在线工具

Form组件生成HTML标签
class cr(Form): # # 初始值 提示信息 字段标签
f1 = fields.CharField(required=True, initial='adf', help_text='请输入用户名', label='用户名',
# 是否可编辑 #label标签的后缀
disabled=False, label_suffix='->')
def cForm(request):
if request.method == 'GET':
obj = cr()
return render(request, 'App7/cForm.html', {'obj': obj})
自动添加样式
class RegModelForm(Form):
nickname = forms.CharField(label='昵称', max_length=8)
username = forms.CharField(label='用户名', max_length=16)
password = forms.CharField(label='密码', min_length=8, max_length=32, widget=forms.PasswordInput(
))
confirm_password = forms.CharField(label='重复密码', widget=forms.PasswordInput(
))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items(): # item就是此类的字段,name为名字,field为对象
field.widget.attrs['class'] = 'form-control'
field.widget.attrs['placeholder'] = '请输入%s' % (field.label)
{{ obj.f1 }}{{ obj.f1.help_text }}<br>
{{ obj.as_p }}
利用Form组件生成标签并保留上一次写的值
class Reg(Form):
username = fields.CharField(min_length=12,
widget=widgets.TextInput(attrs={'class': 'c1'}))
passwd = fields.CharField(min_length=8, max_length=16)
def reg(request):
if request.method == 'GET':
obj = Reg()
return render(request, 'App7/reg.html', {'obj': obj})
else:
obj = Reg(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
else:
print(obj.errors)
return render(request, 'App7/reg.html', {'obj': obj})
novalidate:去除浏览器给我们做的验证
<form action="./reg.jsp" method="post" novalidate>
{% csrf_token %}
<p>
{{ obj.username }}{{ obj.errors.username.0 }}
</p>
<p>
{{ obj.passwd }}{{ obj.errors.passwd.0 }}
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
novalidate:效果

From组件之modelForm
from django.forms import widgets, ModelForm
class Question( ModelForm):
class Meta:
fields = '__all__'
model = Problem # 设置数据库中对应的model
#将这些字段排除在外,即生成Form的时候不会生成这些东西
exclude = ['project', 'creator', 'last_update_time']
widgets = {
'type': widgets.Select(),
'module': widgets.Select(),
'assign': widgets.Select(attrs={'class': 'selectpicker'}),
'priority': widgets.Select(),
'status': widgets.Select(),
'mode': widgets.Select(),
'creator': widgets.Select(),
'attention': widgets.SelectMultiple(attrs={'class': 'selectpicker'}),
'subject': widgets.Input(),
'end_time': widgets.Input(),
'start_time': widgets.Input(),
'desc': widgets.Textarea(),
}
'''使用modelForm'''
forms = Question(data=request.POST)
if forms.is_valid():
'''排除的字段需要逐个添加上'''
forms.instance.project = request.project
forms.instance.creator = request.user
forms.save()
利用modelForm初始化表单的值
obj = models.Problem.objects.filter(id=problem_id, project_id=project_id).first() # 当前编辑的对象
form = Question(request, instance=obj)
通过modelForm实现对manytomany字段的更新
forms = Question(request, data=request.POST)
if forms.is_valid():
objs = models.Problem.objects.filter(id=problem_id, project_id=project_id)
# manytomany字段不可以直接通过update对象来更新
objs.first().attention.set(forms.cleaned_data['attention'])
del forms.cleaned_data['attention']
objs.update(**forms.cleaned_data)
Django基础笔记3(form组件)的更多相关文章
- Django学习笔记之form组件的局部钩子和全局钩子
本文通过注册页面的form组件,查看其中使用的全局钩子和局部钩子. # Create your views here. class RegForm(forms.Form): username = fo ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
- day 64 Django基础十之Form和ModelForm组件
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Mod ...
- Django基础十之Form和ModelForm组件
一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...
- 12.Django基础十之Form和ModelForm组件
一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...
- django框架中的form组件的用法
form组件的使用 先导入: from django.forms import Form from django.forms import fields from django.forms impor ...
- 7月2日 Django注册页面的form组件
forms.py里注册页面的form组件 # Create your views here. class RegForm(forms.Form): username = forms.CharField ...
- Django基础三(form和template)
上一篇博文学习了Django的View和urls,接下来是对django form 和 template的学习. 1 django form django form为我们提供了便捷的方式来创建一些HT ...
- django基础篇05-Form验证组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本简单的操作: from django im ...
- Django基础,Day5 - form表单投票详解
投票URL polls/urls.py: # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, ...
随机推荐
- 记Mybatis动态sql
目录 记MyBatis动态SQL 1.< SQL >标签 2.< if >标签 3.分支标签 1.第一种:用在查询条件上用choose-when:otherwise可不要 2. ...
- 【项目实战】CNN手写识别
由于只需要修改之前基于ANN模型代码的模型设计部分所以篇幅较短,简单的加点注释给自己查看即可 视频链接:https://www.bilibili.com/video/BV1Y7411d7Ys?p=10 ...
- SonarQube支持Gitlab授权登录
部署好SonarQube之后,由于我们内部使用的是自建的Gitlab仓库,即每个开发同学都有Gitlab账号,SonarQube我们就可以使用上Gitlab登录,这样就不需要再维护一套用户体系了. S ...
- CentOS 7.x 升级OpenSSH
升级SSH 存在中断风险,如果SSH 升级失败将会导致终端无法登录,建议在使用本地虚拟机进行测试后对线上生产环境进行升级操作!!! 三级等保评测中对主机进行漏洞扫描发现linux主机存在高危漏洞,查看 ...
- golang channel底层结构和实现
一.介绍 Golang 设计模式: 不要通过共享内存来通信,而要通过通信实现内存共享 channel是基于通信顺序模型(communication sequential processes, CSP) ...
- C语言在Linux下创建一个僵尸进程
第三章编程题3.12 1.僵尸进程是什么 每一个进程都有一个PCB(进程控制块),其中包含进程执行的状态等一系列信息. 当父进程fork()出一个子进程,子进程执行结束后操作系统会回收子进程使用的内存 ...
- Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用
在<基于 vite 创建 vue3 项目>一文中整合了 pinia,有不少伙伴不知道 pinia 是什么,本文简单介绍 pinia.主要包括三方面: pinia 的基本用法,在<基于 ...
- 【编程学习】MATLAB
目录 一.MATLAB基础 1. 学会完成MATLAB的安装与启动 1.1 软件包下载 1.2 安装步骤 2. 矩阵的基本操作与运算 2.1 矩阵的简单输入与操作 2.2 矩阵的基本运算 2.2.1 ...
- 『现学现忘』Git后悔药 — 33、revert撤销(二)
目录 4.一次移除某几次提交 (1)git revert移除某几次提交的修改 (2)git revert 移除某几次连续的提交的修改 5.revert命令常用参数 6.git revert和git r ...
- java集合框架复习----(2)List
文章目录 三.List集合 listIterator:迭代器 List实现类 1.泛型类 2.泛型接口 三.List集合 特点 有序,打印输出的顺序和添加时的顺序一致(不会帮你自动排序) 有下标,可以 ...