1. form介绍

我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。

与此同时, 我们在好多场景下都需要对用户的输入做校验, 比如校验用户是否输入, 输入的长度和格式等正不正确. 如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息。

django form组件就实现了上面所述的功能,总结一下, 其实form组件的主要功能如下:

  • 生成页面可用的HTML标签
  • 对用户提交的数据进行校验
  • 保留上次输入内容

2. 普通方式手写注册功能

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="/reg/" method="post">
{% csrf_token %}
<p>
用户名:
<input type="text" name="name">
</p>
<p>
密码:
<input type="password" name="pwd">
</p>
<p>
<input type="submit" value="注册">
<p style="color: red">{{ error_msg }}</p>
</p>
</form>
</body>
</html>

login.html

 # 注册
def register(request):
error_msg = ""
if request.method == "POST":
username = request.POST.get("name")
password = reqeust.POST.get("password")
# 对注册信息做校验
if len(username) < 6:
# 用户长度小于6
error_msg = "用户名长度不能小于6位"
else:
# 将用户名和密码存在数据库
return HttpResponse("注册成功")
return render(request, "register.html", {"error_msg": error_msg})

views.py

3. 使用form组件实现注册功能

先定义好一个RegForm类:

from django import forms

# 按照django form组件的要求自己写一个类
class RegForm(forms.Form):
username = forms.CharField(label = "用户名")
password = forms.CharField(label = "密码")

再写一个视图函数:

# 使用form组件实现注册方式
def register(request):
form_obj = RegForm()
if request.method == "POST":
# 实例化form对象的时候,把post提交过来的数据直接传进去
form_obj = RegForm(request.POST)
# 调用form_obj校验数据的方法
if form_obj.is_valid():
return HttpResponse("注册成功")
return render(request, "register.html", {"form_obj": form_obj})

再写前端登录页面:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/register/" method = "POST" novalidate autocomplete = "off">
{% csrf_token %}
<div>
<label for="{{ form_obj.username.id_for_label }}">
{{ form_obj.usernaeme.label }}
</label>
{{form_obj.username}}
{{form_obj.username.errors.0}}
</div>
<div>
<label for="{{form_obj.password.id_for_label}}">
{{ form_obj.password.label }}
</label>
{{ form_obj.password }}
{{ form_obj.password.errors.0 }}
</div>
<div>
<input type="submit" value="注册">
</div>
</form>
</body>
</html>

login.html

看网页效果发现也验证了form的功能:

  • 前端页面时form类的对象生成的   --->生成HTML标签功能
  • 当用户名和密码输入为空或者输入错误之后,页面都会有提示  -->用户提交校验功能
  • 当用户输错之后, 再次输入上次的内容还保留在Input框  --->保留上次输入内容

4. form常用字段与插件

创建form类时, 主要涉及到"字段"和"插件", 字段用于对用户请求数据数据的验证, 插件用于自动生成HTML。

4.1 initial

初始值, input框里面的初始值:

class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三" # 设置默认值
)
password = forms.CharField(min_length=6, label="密码")

4.2 error_messages

重写错误信息

class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三",
error_messages={
"requered": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短为8位"
}
)
password = forms.CharField(min_length=6, label="密码")

4.3 password

class LoginForm(forms.Form):
...
password = forms.CharField(
min_length=6,
label="密码",
widget=forms.widgets.PasswordInput(
attrs={"class": "c1"},
render_value=True
)
)

4.4 radioSelect

单radio值为字符串

class LoginForm(forms.Form):
username = forms.CharField(
min_length = 8,
label = "用户名",
initial = "张三",
error_messages = {
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短8位"
}
) password = forms.CharField(min_length=6, label="密码")
gender = forms.fields.ChoiceField(
choices = ((1, "男"), (2, "女"), (3, "不详")),
label = "性别",
initial = 3,
widget = forms.widgets.RadioSelect()
)

4.5 单选select

class LoginForm(forms.Form):
...
hobby = forms.fields.ChoiceField(
choices = ((1, "篮球"), (2, "足球"), (3, "双色球")),
label = "爱好",
initial = 3,
widget = forms.widgets.Select()
)

4.6 多选select

class LoginForm(forms.Form):
...
hobby = forms.fields.MultipleChoiceField(
choices = ((1, "篮球"), (2, "足球"), (3, "双色球")),
label = "爱好:",
initial = [1, 3],
widget = forms.widgets.SelectMultiple()
)

4.7 多选checkbox

class LoginForm(forms.Form):
...
hobby = forms.fields.MultipleChoiceField(
choices = ((1, "篮球"), (2, "足球"), (3, "双色球")),
label = "爱好",
initial = [1, 3],
widget = forms.widgets.CheckboxSelectMultiple()
)

关于choice的注意事项:

在使用选择标签时, 需要注意choices的选项可以从数据库中获取, 但是由于是静态字段, 获取的值无法实时更新, 需要自定义构造方法从而达到此目的。

方法一:

from django.forms import Form
from django.forms import widgets
from django.forms import fields class MyForm(Form):
user = fields.ChoiceField(
initial = 2,
widget = widgets.Select
) def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **Kwargs)
self.fields["user"].choices = models.Classes.object.all().value_list("id", "caption")

方法一:

from django import forms
from django.forms import fields
from django.forms import models as form_model class FInfo(forms.Form):
# 多选
authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all()) # 单选
authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())

Django基础之form表单的更多相关文章

  1. Django基础之Form表单验证

    Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...

  2. Django基础之form表单的补充进阶

    1. 应用Bootstrap样式 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  3. Django组件之Form表单

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

  4. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

  5. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  6. [php基础]PHP Form表单验证:PHP form validator使用说明

    在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验 ...

  7. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

  8. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  9. Django 中的Form表单认证

    一.Form表单   1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签   1.2 创建表单类Form 1. 创建 ...

随机推荐

  1. select into from与insert into select区别

    创建一个table2  向table2中插入 table1中name为11的所有行(前提table2不存在) select * into table2 from table1 where name=‘ ...

  2. hdu 2680 Dijstra

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. winfrom_权限设置_TreeView的相关问题

    1.获取TreeView的值: 循环TreeView,获取checked每个节点的Text,串起来用逗号“,”隔开,保存到数据库. List<string> list = new List ...

  4. Maven错误:警告Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported or published

    该错误是在我将一个普通的由maven管理的java项目变为javaweb项目后出现的,由警告可以看出是说maven的类路径容器不会被导出或发布(即通过maven管理的依赖不会被导出或发布),那么我们用 ...

  5. java中long类型转换为int类型

    由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参考: 一.强制类型转换 [java] l ...

  6. 处理Android键盘覆盖input和textarea框的问题

    $(window).resize(function(){ $('input[type="text"],textarea').on('click', function () { va ...

  7. Image Processing and Computer Vision_Review:HPatches A benchmark and evaluation of handcrafted and learned local descriptors——2017.04

    翻译 HPatches:手工和学习本地描述符的基准和评估——http://tongtianta.site/paper/8979 摘要:在本文中,我们提出了一个评估本地图像描述符的新基准.我们证明现有数 ...

  8. mount -t proc none /proc

    linux initrd里的init脚本中的第一句为: mount -t proc /proc /proc 作用是把proc这个虚拟文件系统挂载到/proc目录.这说明initrd需要用到/proc, ...

  9. CentOs Linux 对于 修改 yum源 为 阿里

    修改yum源为阿里 备份本地yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak 2.获取阿里 ...

  10. mybatis的简单搭建和使用(一)

    前言 mybatis是一个持久层的框架,那么问题来了,什么是持久层的框架呢,持久层就是把数据持久化的保存到数据库中,这种过程一般叫数据持久化的过程,现为了程序员能够很方便的操作数据库,于是就出现持久层 ...