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. WMIC命令的利用技巧

    WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口和批命令脚本执行系统管理的支持.在WMIC出现之前,如果要管理WM ...

  2. Kirinriki 2017多校

    由于每个串的长度为5000,我们去枚举两个自串的对称点(这里注意一下,枚举的时候有两种情况的区间),然后用尺取法爬一遍. ac代码: #include<iostream> #include ...

  3. git基本操作及实用工具

    //git1.安装客户端git Git-2.9.3-rebase-i-64-bit.exe2.安装完成后打开git bashgit config --global user.name "li ...

  4. [转载]clip gradient抑制梯度爆炸

    [转载]clip gradient抑制梯度爆炸 来源:https://blog.csdn.net/u010814042/article/details/76154391 1.梯度爆炸的影响 在一个只有 ...

  5. Springboot整合MybatisPlus

    目录 1.pom文件 2.创建CodeGenerator.java 3.在application.yml中配置mybatis-plus 4.创建MybatisPlusConfig.java文件 其他 ...

  6. jEasyUI 菜单与按钮

    jQuery EasyUI 菜单与按钮 – 创建简单的菜单 <div id="mm" class="easyui-menu" style="wi ...

  7. 【loj#2133 && luoguP2178】[NOI2015]品酒大会

      题目传送门:loj#2133 luoguP2178   简要题意:给定一个字符串\(s\),每个后缀都有权值,对于每个长度\(len\),求出所有最长公共前缀\(\geq len\)的后缀对的总数 ...

  8. linux后台启动项目命令

    在用xshell启动一个项目后,关闭了xshell后,项目又停止了 nohup python admin.py runserver & nohup ........  &   中间包含 ...

  9. input子系统驱动

    input子系统驱动 框架分析 核心层 文件为:/drivers/input/input.c: 首先找到入口函数为**static int __init input_init(void)**,在该函数 ...

  10. Matlab---三维视图的自动旋转

    Matlab---三维视图的自动旋转 这里给出一种格式说明: % figure % plot3(...); % xlabel('X轴'); % ylabel('Y轴'); % zlabel('Z轴') ...