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, ...
随机推荐
- 【ceph】理解Ceph的三种存储接口:块设备、文件系统、对象存储
文章转载自:https://blog.51cto.com/liangchaoxi/4049104
- Vmware虚拟机设置主机端口映射
转载自:https://blog.csdn.net/Mrqiang9001/article/details/80820321
- do...while循环体
基本语法 不要忘记while()后还需要加分号!!! 例(输出五句hello): int i = 1; //循环变量初始化 int max = 5; //循环的最大次数 do{ printf(&quo ...
- 220726 T2 Multisets (思维)
题目描述 我们说一个可重集 AA 比可重集 BB 小,当且仅当对于两个可重集中出现次数不同的最小元素 xx ,元素 xx 在 AA 中出现次数更多. 例如,可重集 {1,2,3}1,2,3 就比可重集 ...
- UVA12186 工人的请愿书 Another Crisis (树形DP)
dp[i]表示要让i向上级发请愿书,最少需要多少个工人递交请愿书,因为要取前T%最小的,所以还要将i的子节点排序(这里用vector实现),取前c个最小的作为dp[i]的值. 这里用dfs可以省去dp ...
- java中的自动拆装箱与缓存(Java核心技术阅读笔记)
最近在读<深入理解java核心技术>,对于里面比较重要的知识点做一个记录! 众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为 ...
- emqx启用JWT令牌认证(包含hmac-based和public-key)
emqx连接启用jwt令牌认证 jwt令牌 概述 JWT 即 JSON Web Tokens 是一种开放的,用于在两方之间安全地表示声明的行业标准的方法(RFC 7519). 组成 令牌的形式 xxx ...
- js红宝书学习笔记(一)引用类型
一.引用类型 ECMAScript中,引用类型是一种数据结构称之为对象定义,,引用对象不同于传统面向对象语言所支持的类和接口等基本结构 创建Object 实例的两种方式: new操作符跟Object构 ...
- scrapy操作mysql/批量下载图片
1.操作mysql items.py meiju.py 3.piplines.py 4.settings.py -------------------------------------------- ...
- 齐博X1-栏目的终极方法get_sort
本节说明栏目的最终方法get_sort 我们之前讲的一系列fun函数调用栏目的方法都是基于get_sort这个公共方法而来 我们来看下这个函数的具体参数这个方法有四个参数: id:也就是栏目id,经常 ...