Django基础之form表单
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表单的更多相关文章
- Django基础之Form表单验证
Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from ...
- Django基础之form表单的补充进阶
1. 应用Bootstrap样式 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- Django组件之Form表单
一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...
- 第三百一十一节,Django框架,Form表单验证
第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...
- Django框架 之 Form表单和Ajax上传文件
Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...
- [php基础]PHP Form表单验证:PHP form validator使用说明
在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验 ...
- Django中的Form表单
Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...
- Django中的Form表单验证
回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...
- Django 中的Form表单认证
一.Form表单 1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签 1.2 创建表单类Form 1. 创建 ...
随机推荐
- js date对象传参获取特定日期的时间戳
当我们想要通过js获取某一特定时间的时间戳时,会通过给date对象传参再通过getTime函数来获取,传递的参数格式也有不同形式.有些时候,可能会因为自己传入参数的格式不正确而导致date对象inva ...
- 01 Java 内存分配全面浅析
http://blog.csdn.net/shimiso/article/details/8595564 Java 内存分配全面浅析 本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的 ...
- Python字符串常用的方法——真心觉得比java,c好用
# Strings have many methods wo can use rand_string=" life is a beautiful struggle " print( ...
- pm2 常用操作
PM2全局安装 npm i pm2 -g PM2启动.net core pm2 start "dotnet xxx.dll" --name api //name后面跟你要取的名字 ...
- luogu题解 P4092 【[HEOI2016/TJOI2016]树】树链剖分
题目链接: https://www.luogu.org/problemnew/show/P4092 瞎扯--\(O(Q \log^3 N)\)解法 这道先yy出了一个\(O(Q \log^3 N)\) ...
- windows连接远程服务器报错'SSH' 不是内部或外部命令,也不是可运行的程序 或批处理文件 解决方案
网上在windows下连接远程服务器的步骤如下: 1.打开cmd命令行窗口 2.输入cd ~/.ssh,进入c盘下的.ssh文件 3.输入“ssh root@远程服务器的ip地址”连接远程服务器, b ...
- seaborn:一个更强大的画图工具
数据加载: 1. Countplot 和之前的pandas绘图相比,使用countplot可以自动计算每类的数量. 2. KDE Plot KDE,是"kernel density esti ...
- 如何在调用Marketing Cloud contact创建API时增加对扩展字段的支持
需求:扩展字段"微信ID"是我创建出来的extension field,我想用Marketing Cloud提供的contact creation API,在创建contact时也 ...
- maskrcnn-benchmark错误:ImportError: cannot import name rnn_compat
错误: from apex import amp File "build/bdist.linux-x86_64/egg/apex/__init__.py", line 5, in ...
- RabbitMQ 功能
学习完了rabbitmq总一下 RabbitMQ依赖的语言 erlang 第一它可以实现不同程序之间的程序信息储存交互,在易用性.扩展性.高可用性的方面不俗. rabbitmq相当于一个中间人,我们同 ...