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组件)的更多相关文章

  1. Django学习笔记之form组件的局部钩子和全局钩子

    本文通过注册页面的form组件,查看其中使用的全局钩子和局部钩子. # Create your views here. class RegForm(forms.Form): username = fo ...

  2. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  3. day 64 Django基础十之Form和ModelForm组件

    Django基础十之Form和ModelForm组件   本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Mod ...

  4. Django基础十之Form和ModelForm组件

    一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...

  5. 12.Django基础十之Form和ModelForm组件

    一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...

  6. django框架中的form组件的用法

    form组件的使用 先导入: from django.forms import Form from django.forms import fields from django.forms impor ...

  7. 7月2日 Django注册页面的form组件

    forms.py里注册页面的form组件 # Create your views here. class RegForm(forms.Form): username = forms.CharField ...

  8. Django基础三(form和template)

    上一篇博文学习了Django的View和urls,接下来是对django form 和 template的学习. 1 django form django form为我们提供了便捷的方式来创建一些HT ...

  9. django基础篇05-Form验证组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本简单的操作: from django im ...

  10. Django基础,Day5 - form表单投票详解

    投票URL polls/urls.py: # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, ...

随机推荐

  1. 【ceph】理解Ceph的三种存储接口:块设备、文件系统、对象存储

    文章转载自:https://blog.51cto.com/liangchaoxi/4049104

  2. Vmware虚拟机设置主机端口映射

    转载自:https://blog.csdn.net/Mrqiang9001/article/details/80820321

  3. do...while循环体

    基本语法 不要忘记while()后还需要加分号!!! 例(输出五句hello): int i = 1; //循环变量初始化 int max = 5; //循环的最大次数 do{ printf(&quo ...

  4. 220726 T2 Multisets (思维)

    题目描述 我们说一个可重集 AA 比可重集 BB 小,当且仅当对于两个可重集中出现次数不同的最小元素 xx ,元素 xx 在 AA 中出现次数更多. 例如,可重集 {1,2,3}1,2,3 就比可重集 ...

  5. UVA12186 工人的请愿书 Another Crisis (树形DP)

    dp[i]表示要让i向上级发请愿书,最少需要多少个工人递交请愿书,因为要取前T%最小的,所以还要将i的子节点排序(这里用vector实现),取前c个最小的作为dp[i]的值. 这里用dfs可以省去dp ...

  6. java中的自动拆装箱与缓存(Java核心技术阅读笔记)

    最近在读<深入理解java核心技术>,对于里面比较重要的知识点做一个记录! 众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为 ...

  7. emqx启用JWT令牌认证(包含hmac-based和public-key)

    emqx连接启用jwt令牌认证 jwt令牌 概述 JWT 即 JSON Web Tokens 是一种开放的,用于在两方之间安全地表示声明的行业标准的方法(RFC 7519). 组成 令牌的形式 xxx ...

  8. js红宝书学习笔记(一)引用类型

    一.引用类型 ECMAScript中,引用类型是一种数据结构称之为对象定义,,引用对象不同于传统面向对象语言所支持的类和接口等基本结构 创建Object 实例的两种方式: new操作符跟Object构 ...

  9. scrapy操作mysql/批量下载图片

    1.操作mysql items.py meiju.py 3.piplines.py 4.settings.py -------------------------------------------- ...

  10. 齐博X1-栏目的终极方法get_sort

    本节说明栏目的最终方法get_sort 我们之前讲的一系列fun函数调用栏目的方法都是基于get_sort这个公共方法而来 我们来看下这个函数的具体参数这个方法有四个参数: id:也就是栏目id,经常 ...