Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第八章:django表单 > 8.2节: django内置的表单

8.2节: django内置的表单

薯条老师 2020-09-23 07:18:28 231459 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

8.2.1 django表单

8.1节的内容中,我们直接使用了HTML来编写表单。在实际的开发过程中,处理表单是一件较为繁琐的工作,需要将不同类型的输入布局在一张表单中进行显示,然后提交到服务器中进行验证和处理。django内置的表单系统可以简化和自动化上述工作的大部分内容,并且会自动对用户的输入进行验证和清理,以帮助后端程序员编写更安全的代码。django中的表单系统主要做了以下三个方面的工作:

(1) 对数据进行重组,以便进行表单渲染

(2) 为用户的输入创建HTML表单

(3) 接收并处理用户的输入

8.2.2 django中的Form类

django表单系统的核心组件是Form类,在项目中使用Form类,需要从django.forms中进行导出:

from django.forms import Form

django中使用Form类构建表单,类似于django模型的定义:

(1) 从Form中派生一个子类

(2) 在子类中定义相关的字段类型,字段类型对应于HTML form中的输入标签

使用Form类来快速构建form表单:

from django import forms
class RegisterForm(forms.Form):
    account = forms.CharField(max_length=20,label="输入您的账号")
    password1 = forms.CharField(max_length=20, widget=forms.PasswordInput,label="输入账号密码")
    password2 = forms.CharField(max_length=20, widget=forms.PasswordInput,label="再次输入密码")

在上文代码中,字段类型中的max_length用来定义输入的最大长度,label用来定义提示标签,widget用来定义表单输入的类型。CharField的默认输入类型为TextInput,表示文本输入框,赋值为PasswordInput时,表示密码输入框。Form类中的字段名作为表单中的name参数。使用

Form类派生出一个子类以后,在视图中可以通过用户的请求参数来构造一个Form对象:
from django.http import HttpResponse
from django.shortcuts import render
 
from .forms import RegisterForm
 
def register(request):
    if request.method == 'POST':
        # 用户提交的输入保存在HttpRequest对象的POST属性中
        form = RegisterForm(request.POST)
    elif request.method == 'GET':
        # 请求方法为GET时,构造一个空的表单对象,传递给模板进行渲染     
        form = RegisterForm()
  return render(request, "register.html", {"register_form": form})

RegisterFrom在模板中被渲染后所对应的html代码:

<tr>
    <th><label for="id_account">输入您的账号:</label></th>
    <td><input type="text" name="account" maxlength="20" required id="id_account"></td>
</tr>
 
<tr>
    <th><label for="id_password1">输入登录密:</label></th>
    <td><input type="password" name="password1" maxlength="20" required id="id_password1"> </td>
</tr>
 
<tr>
    <th><label for="id_password2">再次输入密:</label></th>
    <td><input type="password" name="password2" maxlength="20" required id="id_password2"></td>
</tr>

同学们要注意的是,渲染后的表单不会包含<form>标签, <table>标签,以及提交按钮,我们必须自己在模板中进行定义。使用django内置的表单系统,其优势在于可以自动对用户的输入进行校验和清理。Form对象的校验方法:Form.is_valid()。该方法返回布尔类型,值为True时表示用户的输入合法,否则表示非法。

Form对象的数据清理

form对象在对数据验证通过以后,会自动对数据进行清理,所谓的数据清理,是指将数据标准化为Python中的数据类型,例如在Form类中定义了一个日期字段,如果用户的输入是字符串,那么在进行数据清理以后,会将它转换为datetime.date对象。form对象在对数据进行清理以后,会将清理后的值保存在cleaned_data属性中。cleaned_data是一个字典类型,字典中的键名与Form类中的字段名一致。

使用form对象对输入进行验证和清理:

from django.http import HttpResponse
from django.shortcuts import render
 
from .forms import RegisterForm
 
def register(request):
    if request.method == 'POST':
        # 用户提交的输入保存在HttpRequest对象的POST属性中
        form = RegisterForm(request.POST)
        if form.is_valid():
            # 使用cleaned_data属性来获取清理后的用户输入
            account = form.cleaned_data["account"]
            password1 = form.cleaned_data["password1"]
            password2 = form.cleaned_data["password2"]
        
        elif request.method == 'GET':
            # 请求方法为GET时,构造一个空的表单对象,传递给模板进行渲染     
            form = RegisterForm()
        return render(request, "register.html", {"register_form": form})

8.2.3 使用django表单

我们现在将8.1节中的代码,改为使用django表单,请读者按照以下步骤进行操作:

(1) 在django应用的目录中创建forms.py

在forms.py中定义RegisterForm,代码如下:

from django import forms
 
# Create your forms here.
 
class RegisterForm(forms.Form):
    account = forms.CharField(max_length=20)
    password1 = forms.CharField(max_length=20,widget=forms.PasswordInput)
    password2 = forms.CharField(max_length=20, widget=forms.PasswordInput)

(2) 更新register视图代码

from django.http import HttpResponse
from django.shortcuts import render
 
from .forms import RegisterForm
 
def register(request):
    if request.method == 'POST':
        # 用户提交的输入保存在HttpRequest对象的POST属性中
        form = RegisterForm(request.POST)
        if form.is_valid():
            account = form.cleaned_data["account"]
            password1 = form.cleaned_data["password1"]
            password2 = form.cleaned_data["password2"]
            if password1 != password2:
                return HttpResponse("密码输入不匹配")
            else:
                return HttpResponse("注册成功")
    
    elif request.method == 'GET':
        # 请求方法为GET时,构造一个空的表单对象,传递给模板进行渲染     
        form = RegisterForm()
        # 将表单对象form传递给模板进行渲染
    return render(request, "register.html", {"register_form": form})

(3) 更新模板register.html

更新后的代码如下:

<form action="/register/" method="POST">
{# django默认开启了csrf保护,需要再加上下面一行模板标签 #}
{% csrf_token %}
<table>
{{register_form}}
</table>
<input type="submit" value="注册">
</form>

(4) 在浏览器中进行测试

启动django服务器以后,在浏览器中输入http://127.0.0.1:8080/register/:

4}1]1N`5JKQZEW]$F86_QYE.png

django中的表单系统会自动对输入进行验证。现在我们不输入任何数据,直接点击注册按钮,此时页面弹出了错误提示信息:

TIDF(83[{NE(S0J17UJON5V.png

8.2.4 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


欢迎 发表评论: