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. Unity 屏幕坐标到UGUI RectTransform本地坐标的转换

    public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camer ...

  2. javaIO——PushbackReader

    1. 注释解释: A character-stream reader that allows characters to be pushed back into the stream. 一个允许字符被 ...

  3. 使用Vue CLI脚手架搭建vue项目

    本次是使用@vue/cli 3.11.0版本搭建的vue项目 1. 首先确保自己的电脑上的Node.js的版本是8.9版本或者以上 2. 全局安装vue/cli npm install @vue/cl ...

  4. TypeScript入门四:TypeScript的类(class)

    TypeScript类的基本使用(修饰符) TypeScript类的抽象类(abstract) TypeScript类的高级技巧 一.TypeScript类的基本使用(修饰符) TypeScript的 ...

  5. 17.SpringMVC核心技术-拦截器

    SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定 的用户请求, 并进行相应的预处理与后处理.其拦截的时间点在“处理器映射器根据用户提 交的请求映射 ...

  6. 1.SpringMVC 概述

    SpringMVC 简介 SpringMVC 也叫 Spring web mvc ,属于表现层的框架.SpringMVC 是 Spring框架的一部分,是在Spring3.0后发布的 第一个Sprin ...

  7. Python3简易接口自动化测试框架设计与实现(中)

    目录 7.Excel数据读取 7.1.读取配置文件 7.1.编写Excel操作类 8.用例组装 9.用例运行结果校验 10.运行用例 11 .小结 上一篇:Python3简易接口自动化测试框架设计与实 ...

  8. spring 整合mongodb报NoSuchMethodError错误

    刚开始通过网上查到相关的资料进行了一些配置,参考链接:http://www.open-open.com/lib/view/open1454374782167.html maven的dependenci ...

  9. ffmpeg 命令行 杂记

    输入mp4文件中的音频每一帧的信息 ffprobe -show_streams -select_streams a -show_format -show_frames .\HYUNDAIMOBIS.m ...

  10. 2.04_Python网络爬虫_Requests模块

    一:Requests: 让 HTTP 服务人类 虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 ...