一、构建一个表单

假设你想在你的网站上创建一个简单的表单,以获得用户的名字。你需要类似这样的模板:

<form action="/your-name/" method="post">
<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name">
<input type="submit" value="OK">
</form>

这是一个非常简单的表单。实际应用中,一个表单可能包含几十上百个字段,其中大部分需要预填充,而且我们预料到用户将来回编辑-提交几次才能完成操作。

我们可能需要在表单提交之前,在浏览器端作一些验证。我们可能想使用非常复杂的字段,以允许用户做类似从日历中挑选日期这样的事情,等等。

这个时候,让Django 来为我们完成大部分工作是很容易的。

Form表单的功能

  • 自动生成HTML表单元素
  • 检查表单数据的合法性
  • 如果验证错误,重新显示表单(数据不会重置)
  • 数据类型转换(字符类型的数据转换成相应的Python类型)

二、在Django 中构建一个表单

1、Form 类

创建form组件

from django import forms
from django.forms import widgets
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
class LoginForm(forms.Form):
user=forms.CharField(label="用户名",min_length=3,max_length=8,
widget=widgets.TextInput(attrs={"class": "form-control"}),
error_messages={"min_length":"太短","required":"必填"}) pwd=forms.CharField(label="密码",min_length=5,
widget=widgets.PasswordInput(attrs={"class":"form-control"}),
error_messages={"min_length":"太短", "required": "必填"}
)

2、views.py

如果访问视图的是一个GET 请求,它将创建一个空的表单实例并将它放置到要渲染的模板的上下文中。这是我们在第一个访问该URL 时预期发生的情况。

如果表单的提交使用POST 请求,那么视图将再次创建一个表单实例并使用请求中的数据填充它:form = NameForm(request.POST)。这叫做”绑定数据至表单“(它现在是一个绑定的表单)。

我们调用表单的is_valid()方法;如果它不为True,我们将带着这个表单返回到模板。这时表单不再为空(未绑定),所以HTML 表单将用之前提交的数据填充,然后可以根据要求编辑并改正它。

如果is_valid()True,我们将能够在cleaned_data 属性中找到所有合法的表单数据。在发送HTTP 重定向给浏览器告诉它下一步的去向之前,我们可以用这个数据来更新数据库或者做其它处理。

  • if GET请求

if GET请求:
login_form=LoginForm()
return render(request,"login_form.html",locals()) 渲染方式:
(1) login_form.as_p (2) 推荐
<form action="" method="post" novalidate>
{% csrf_token %}
<div class="form-group">
<label for="">{{ login_form.user.label }}</label>
{{ login_form.user }} <span>{{ login_form.errors.user.0 }}</span>
</div>
<div class="form-group">
<label for="">{{ login_form.pwd.label }}</label>
{{ login_form.pwd }} <span>{{ login_form.errors.pwd.0 }}</span>
</div>
<input type="submit">
</form>
  • if POST 请求

            if POST 请求:

                    login_form=LoginForm(request.POST)

                    if login_form.is_valid():
# 所有字段验证成功
# 所有请求数据:login_form.cleaned_data else:
#login_form.errors # 字典:{"user":["","",]}
#login_form.errors.get("user") # 列表:["",""] return render(request, "login_form.html", locals()) 渲染:
<form action="" method="post" novalidate>
{% csrf_token %}
<div class="form-group">
<label for="">{{ login_form.user.label }}</label>
{{ login_form.user }} <span>{{ login_form.errors.user.0 }}</span>
</div>
<div class="form-group">
<label for="">{{ login_form.pwd.label }}</label>
{{ login_form.pwd }} <span>{{ login_form.errors.pwd.0 }}</span>
</div>
<input type="submit">
</form>
  • is_valid()

Form 的实例具有一个is_valid() 方法,它为所有的字段运行验证的程序。当调用这个方法时,如果所有的字段都包含合法的数据,它将:

  • 返回True
  • 将表单的数据放到cleaned_data属性中。
is_valid:

             self.errors={}

             self.cleaned_data={}

             for name ,field in self.fields.items():

                 if field(数据):
self.cleaned_data[name]="数据" else:
self.errors[name]="错误信息"

钩子函数

    def clean_user(self):
val=self.cleaned_data.get("user") import re
# if not UserInfo.objects.filter(username=val):
# return val
# else:
# raise ValidationError("") if not val.isdigit():
return val
else:
raise ValidationError("用户名不能是纯数字!") def clean_pwd(self):
val=self.cleaned_data.get("pwd") if val.startswith("yuan"):
return val
else:
raise ValidationError("没有yuan开头")

代码

from django.shortcuts import render,HttpResponse

# Create your views here.

from django import forms
from django.forms import widgets
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
class LoginForm(forms.Form):
user=forms.CharField(label="用户名",min_length=3,max_length=8,
widget=widgets.TextInput(attrs={"class": "form-control"}),
error_messages={"min_length":"太短","required":"必填"}) pwd=forms.CharField(label="密码",min_length=5,
widget=widgets.PasswordInput(attrs={"class":"form-control"}),
error_messages={"min_length":"太短", "required": "必填"}
) def clean_user(self):
val=self.cleaned_data.get("user") import re
# if not UserInfo.objects.filter(username=val):
# return val
# else:
# raise ValidationError("") if not val.isdigit():
return val
else:
raise ValidationError("用户名不能是纯数字!") def clean_pwd(self):
val=self.cleaned_data.get("pwd") if val.startswith("yuan"):
return val
else:
raise ValidationError("没有yuan开头") # email=forms.EmailField()
# age=forms.IntegerField() def login(request):
if request.method=="POST": login_form=LoginForm(request.POST)
if login_form.is_valid():
print(login_form.cleaned_data) # {"user":"","pwd":123}
return HttpResponse("OK")
else:
# print(login_form.cleaned_data)# {"pwd":123456}
# print(type(login_form.errors)) # {"user":["","",]}
# print(type(login_form.errors.get("user"))) # {"user":"....."}
return render(request, "login_form.html", locals()) login_form=LoginForm()
return render(request,"login_form.html",locals())

views.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body> {#<form action="" method="post" novalidate>#}
{# {% csrf_token %}#}
{# {{ login_form.as_p }}#}
{# <input type="submit">#}
{#</form>#} <hr> <div class="container">
<div class="row">
<div class="col-md-5">
<form action="" method="post" novalidate>
{% csrf_token %}
<div class="form-group">
<label for="">{{ login_form.user.label }}</label>
{{ login_form.user }} <span>{{ login_form.errors.user.0 }}</span>
</div>
<div class="form-group">
<label for="">{{ login_form.pwd.label }}</label>
{{ login_form.pwd }} <span>{{ login_form.errors.pwd.0 }}</span>
</div>
<input type="submit">
</form>
</div>
</div>
</div> </body>
</html>

login_form.html

【django之form表单】的更多相关文章

  1. Django的form表单

    html的form表单 django中,前端如果要提交一些数据到views里面去,需要用到 html里面的form表单. 例如: # form2/urls.py from django.contrib ...

  2. Django 11 form表单(状态保持session、form表单及注册实现)

    Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...

  3. 转载:Django之form表单

    转载: 一.使用form类创建一个表单 先定义好一个RegForm类: forms.py from django import forms # 导入forms类 class NameForm(form ...

  4. Django--分页器(paginator)、Django的用户认证、Django的FORM表单

    分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['joh ...

  5. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

  6. django中form表单的提交:

    一,关于表单: 表单在百度百科的解释:   表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域 ...

  7. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  8. Django的form表单之文件上传

    在生成input标签的时候可以指定input标签的类型为file类型 <!DOCTYPE html> <html lang="en"> <head&g ...

  9. Django 提交 form 表单(使用sqlite3保存数据)

    优化 提交 form 表单,https://www.cnblogs.com/klvchen/p/10608143.html 创建数据库的字段,在 models.py 中添加 from django.d ...

随机推荐

  1. BZOJ:4209: 西瓜王

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4209 (虽然仅仅是看在名字的份上,我们还是得说这题是一道) 绝世好题!西瓜王!西瓜王!西瓜 ...

  2. bzoj:3994:vijos1949: [SDOI2015]约数个数和

    Description  设d(x)为x的约数个数,给定N.M,求     Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M.   O ...

  3. 数位dp初探

    我这种蒟蒻就一直不会写数位dp.. 于是开了个坑.. 1833: [ZJOI2010]count 数字计数 这道被KPM大爷说是入门题..嗯似乎找找规律然后减掉0的情况后乱搞就可以了..(但是还是写了 ...

  4. c语言中标识符的作用域

    1.代码块作用域(block scope) 位于一对花括号之间的所有语句称为一个代码块,在代码块的开始位置声明的标识符具有代码块作用域,表示它们可以被这个代码中的所有语句访问.函数定义的形式参数在函数 ...

  5. bean的作用域 :singleton和prototype

  6. 任务驱动 搭建SSM开发环境

    本篇主要阐述(IntelliJ IDEA + Maven + Spring + Spring MVC + Mybatis)搭建 为什么想要搭建ssm? 近期正好自己有一个小的点子要实现,恰好这学期开了 ...

  7. hbase性能调优_表设计案例

    hbase性能调优案例 1.人员-角色   人员有多个角色  角色优先级   角色有多个人员   人员 删除添加角色   角色 可以添加删除人员   人员 角色 删除添加   设计思路 person表 ...

  8. include指令与include动作的区别(面试要考)

    include指令: 语法格式:<%@ include file=" " ...%> 发生作用的时间:页面转换期间 包含的内容:页面的实际内容 转换成的servlet: ...

  9. ico图标在谷歌浏览器中如何显示?

    http://www.zen-cart.cn/forum/topic266117.html 版主: shaning 发表回复 2 篇帖子 • 分页: 1 / 1  ico图标在谷歌浏览器中如何显示? ...

  10. Ring3句柄表的枚举

    由于windows并没有给出枚举所有句柄所用到的API,要获得句柄,我们必须使用未公开的Native API才可以,使用如下函数: NTSTATUS WINAPI NtQuerySystemInfor ...