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, ...
随机推荐
- Kubernetes生态架构图
图片来源于:https://gitbook.curiouser.top/ 一.kubernetes 集群架构图 二.Openshift or Kubernetes 集群架构图 三.常见的 CI/CD ...
- Elasticsearch官方文档离线访问实操指南
文章转载自:https://mp.weixin.qq.com/s/Cn9ddkj-cne5pKtfOgNPbg 延申一下,不仅能下载Elasticsearch官方文档,还能下载其他软件的官方文档,详看 ...
- day09-2视图和用户权限
视图和用户权限 1.视图(view) 看一个需求 emp表的列信息很多,有些信息是个人重要信息(比如:sal.comm.mgr.hiredate),如果我们希望某个用户只能查询emp表的empno.e ...
- git-secret:在 Git 存储库中加密和存储密钥(下)
在之前的文章中(点击此处查看上一篇文章),我们了解了如何识别包含密钥的文件,将密钥添加到 .gitignore ,通过 git-secret 进行加密,以及将加密文件提交到存储库.在本篇文章中,将带你 ...
- python 矩阵切片
假设n是一个numpy或者torch.tensor张量,那么 n[a:b,c:d]则代表从a到b行(不含b行),c到d列(不含d列)的切片 当然,ab.cd中的数是可以省略掉,只要abcd中有一个数即 ...
- 机器学习实战-AdaBoost
1.概念 从若学习算法出发,反复学恶习得到一系列弱分类器(又称基本分类器),然后组合这些弱分类器构成一个强分类器.简单说就是假如有一堆数据data,不管是采用逻辑回归还是SVM算法对当前数据集通过分类 ...
- Python 嵌入式打包 (图文)
Python嵌入式打包过程 目录 Python嵌入式打包过程 下载嵌入式包 解压和配置 安装pip和其他依赖 启动项目 python嵌入式打包:将python环境与项目代码打包到同一个文件夹中,在其他 ...
- Java:既然有了synchronized,为什么还要提供Lock?
摘要:在Java中提供了synchronized关键字来保证只有一个线程能够访问同步代码块.既然已经提供了synchronized关键字,那为何在Java的SDK包中,还会提供Lock接口呢?这是不是 ...
- numpy常用知识点备忘(2)
x.ravel() 和 x.flatten() : 将多为数组降维到1维.ravel()返回元素的引用(对象不一样,但是元素是引用),flatten()返回新的元素. np.meshgrid(x, y ...
- MAUI 初体验 联合 WinForm 让家里废弃的手机当做电脑副品用起来
软件效果图 软件架构草图 效果解释:运行 winform 端后 使用 ctrl+c 先复制任何词语,然后ctrl+空格 就可以将翻译结果显示在 安卓,IOS,windows 甚至 mac 任意客户端 ...