学习笔记,仅供参考



文章目录




Django中的forms模块



在Django中提供了forms模块,用forms模块可以自动生成form表单的内部的表单控件,同时,在服务器端可以用对象的形式接收并操作客户端表单元素,并能对表单的数据进行服务器端验证。



  • forms模块的作用

通过forms模块,允许将表单与class相结合,允许通过class生成表单



使用forms模块的步骤



  • 应用中创建forms.py模块


  • 导入django提供的forms
import django import forms



  • 定义表单类(一个class会生成一个表单)
class FormName(forms.Form):
pass



  • 在表单类中增加类属性

一个类属性对应表单中的一个控件。



  • 利用forms.Form类型的对象自动(或手动)生成表单内容


  • 读取form表单并进行验证数据


定义表单类的语法



类属性 = forms.Field类型(参数)
  • Field类型
class ClassName(froms.Form):
forms.CharField() #文本框 <input type="text">
forms.ChoiceField() #下拉选项框 <select>
forms.DateField() #日期框 <input type="date">



  • 参数
label
#控件前的文本
widget
#指定小部件
initial
#控件的初始值(主要针对文本框类型)
required
#是否为必填项,值为(True/False),默认为True



在模板中解析form对象



  • 解析form对象

在视图中创建form对象,并将其发送到模板文件中进行解析:

def viewsName(request):
form = forms.FormName()
return render(request,'xx.html',locals())



在模板文件中解析:

<!--手动解析-->
{% for field in form %}
{{field.label}}: {{field}}
<!--field.label表示的是label参数值, field表示的是表单控件-->
{% endfor %}

<!--自动解析-->
{{form.as_p}}
<!--将form中的每个属性(控件/文本)都使用p标记包裹起来再显示-->
{{form.as_ul}}
<!--将form中的每个属性(控件/文本)都使用li标记包裹起来再显示-->
<!--必须手动提供ol或ul标记-->
{{form.as_table}}
<!--将form中的每个属性(控件/文本)都使用tr标记包裹起来再显示-->
<!--必须手动提供table标记-->



内置小部件widget



  • 什么是小部件

小部件是指,生成在网页上的控件以及一些html属性。



  • 常用的小部件类型

widget名称

对应和type类值

TextInput

type=‘text’

PasswordInput

type=‘password’

NumberInput

type=“number”

EmailInput

type=“email”

URLInput

type=“url”

HiddenInput

type=“hidden”

CheckboxInput

type=“checkbox”

CheckboxSelectMultiple

type=“checkbox”

RadioSelect

type=“radio”

Textarea

textarea标记(大文本框)

Select

select标记

SelectMultiple

select multiple 标记


  • 小部件的使用

语法1:

类属性 = forms.CharField(
label='xxx',
widget=forms.小部件类型
)

语法2(在指定控件类型的基础之上还能指定控件的一些html属性值):

类属性 = forms.CharField(
label='xxx',
widget=forms.小部件类型(
attrs={
'html属性名':'值',
'html属性名':'值',
}
)
)




举个例子



首先,我们在userinfo应用下创建一个表单模块forms.py:

Django(part45)--forms模块_控件

在forms.py模块中,我们敲入如下代码:

# -*- coding: utf-8 -*-
from django import forms

class RegForm(forms.Form):
username = forms.CharField(label = "输入昵称")
password = forms.CharField(label = "输入密码")
passwordRepeat = forms.CharField(label = "再次输入密码")
#<input type="text">

在userinfo应用的模板文件夹templates下创建一个新的模板test_form.html:

Django(part45)--forms模块_控件_02

在userinfo应用的urls.py文件中,我们添加一个路由:

from django.urls import re_path
from . import views

urlpatterns = [
re_path(r'^test_form/', views.test_form),
]

在userinfo应用的views.py模块中,我们添加一个视图函数:

def test_form(request):
if request.method == "GET":
myform = forms.RegForm()
#创建对象
return render(request, 'userinfo/test_form.html',
locals())
else:
print("其他请求")

在test_form.html模板中,我们敲入如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form表单</title>
</head>
<body>
<form action="/userinfo/test_form/" method="POST">
{% csrf_token %}
{{myform.as_p}}
{# 自动生成form表单的内部的表单控件 #}
</form>
</body>
</html>



我们向http://127.0.0.1:8000/userinfo/test_form/发起请求:

Django(part45)--forms模块_html_03



由于提交表单数据的按钮不能用forms类自动生成,所以我们在test_form.html模块中自己加一个提交按钮:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form表单</title>
</head>
<body>

<form action="/userinfo/test_form/" method="POST">
{% csrf_token %}
{{myform.as_p}}
{# 自动生成form表单的内部的表单控件 #}
<input type="submit" value="注册">
</form>
</body>
</html>

在forms.py模块中,我又添加了一个手机号输入框,并设置此框内容可为空:

from django import forms

class RegForm(forms.Form):
username = forms.CharField(label = "输入昵称")
password = forms.CharField(label = "输入密码")
passwordRepeat = forms.CharField(label = "再次输入密码")
tele = forms.CharField(label = "手机号", required = False)
#<input type="text">



我们再次向http://127.0.0.1:8000/userinfo/test_form/发起请求:

Django(part45)--forms模块_表单_04

我们看一下该页面的源代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>form表单</title>
</head>
<body>

<form action="/userinfo/test_form/" method="POST"></form>
<input type="hidden" name="csrfmiddlewaretoken" value="bGxM5HvNFrdDqh30zlC1slBqKRmlSTUHlJz7EHabBgZydsv9KVHEjqAiM4qEaNeg">
<p><label for="id_username">输入昵称:</label> <input type="text" name="username" required id="id_username"></p>
<p><label for="id_password">输入密码:</label> <input type="text" name="password" required id="id_password"></p>
<p><label for="id_passwordRepeat">再次输入密码:</label> <input type="text" name="passwordRepeat" required id="id_passwordRepeat"></p>
<p><label for="id_tele">手机号:</label> <input type="text" name="tele" id="id_tele"></p>

<input type="submit" value="注册">
</body>
</html>




现在,我们给我们的表单加一些小部件,比如将文本框改为密码输入框:

from django import forms

class RegForm(forms.Form):
username = forms.CharField(label = "输入昵称")
password = forms.CharField(label = "输入密码",
widget=forms.PasswordInput)
passwordRepeat = forms.CharField(label = "再次输入密码",
widget=forms.PasswordInput)
tele = forms.CharField(label = "手机号", required = False)
email = forms.CharField(label = "邮箱", required = False,
widget=forms.EmailInput)

我们再次向http://127.0.0.1:8000/userinfo/test_form/发起请求:

Django(part45)--forms模块_控件_05