Django中表单的使用
之前的12篇博客,我们介绍了Django中最为重要的MVT开发模式,包括模型层(Model)、视图层(View)和模板层(Template) ,这篇博客我们继续学习Django中一个比较重要的知识点:表单。表单在系统开发中的使用十分广泛,比如基础的注册功能、登录功能都离不开表单。
表单的定义
宏观定义:表单可以和我们日常生活中填写纸质表格联系起来,即通过集合信息交付给指定的人或位置。
Web开发中的定义:从web开发的角度来说,通过前端的表单模块填写后端服务需要的信息, 填写完毕后,提交给后端服务的一个工具。
表单一般分为四个部分:提交地址,提交方法,表单组件,提交按钮。如下所示是一个典型的表单内容:
<form action="/register" method="POST">
<input type="text" value="用户名" />
<input type="submit" value="提交" />
</form>
- form:表单标签,用于定义一个表格。action属性指定提交地址,即form表单的内容提交到的后端服务位置;method属性指定提交的方法。
- input:输入标签,用来填写内容。
- select:选择标签,可以在多个选项中进行选择。
上面的代码展示在前端界面如下:
在Django项目中使用表单,有两种方式:
- 自己实现HTML代码,设计前端页面,然后和后端进行交互。
- 使用Django中的表单,用Python代码实现表单,无需书写HTML代码。
一般在实际应用开发过程中,我们选择第一种方式,这样的实现方式对于前端的可控性更强。
HTML代码实现表单
首先介绍如何使用HTML实现表单,并且和后端进行交互。
1、创建项目,完成应用注册和模版文件路径设置。
2、编写视图函数,实现get方法(展示前端界面)和post方法(接收表单输入)。
app/views.py:
from django.shortcuts import render, redirect
from django.views.generic import View
class Register(View):
TEMPLATE = 'register.html'
def get(self, request):
return render(request, self.TEMPLATE)
def post(self, request):
username = request.POST.get('username')
password = request.POST.get('password')
print(username)
print(password)
return redirect('/register')
3、实现前端页面。
templates/register.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
<!--action属性定义提交地址-->
<!--method属性定义表单提交方法,一般来讲都是POST方法-->
<!--<form action="/register" method="POST">-->
<!--在定义提交地址的时候,推荐使用{% url url_name %}的方式,因为我们的URL可能会变化,但是只要名称不变,就不会影响到之前写的代码-->
<form action="{% url 'register' %}" method="POST">
{% csrf_token %}
<!--name属性定义该标签的名称,之后在后端可以通过request.POST.get('username')的方式获取得到-->
<!--placeholder属性定义该标签在前端页面的显示内容-->
<label>用户名</label><input type="text" name="username" placeholder="用户名"/><br/>
<label>密码</label><input type="password" name="password" placeholder="密码"/><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
4、配置路由
app/urls.py:
from django.urls import path
from .views import Register
urlpatterns = [
path('register', Register.as_view(), name='register')
]
five/urls.py:
from django.contrib import admin
from django.urls import path, include
from app import urls as app_urls
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(app_urls))
]
5、启动服务,在浏览器中进行访问。
输入用户名和密码之后,点击提交按钮,可以在后端获取我们输入的数据:
在表单提交过程中,需要在表单中设置跨域提交,否则会出现如下的错误:
Python代码实现表单
下面介绍如何使用Django中自带的表单模块,使用Django中自带的表单模块,可以直接使用Python代码实现对表单的定义,不必书写HTML代码。
1、创建定义表单的Python文件(app/forms.py)
from django import forms
from django.forms import fields
class RegisterForm(forms.Form):
# max_length属性设置输入用户名的最大长度
# required = True表示不能为空
username = fields.CharField(max_length=20, required=True)
password = fields.CharField(widget=forms.PasswordInput)
2、创建前端代码文件(templates/registerForm.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'register' %}" method="post">
{% csrf_token %}
{{form.as_table}}
<input type="submit" value="提交">
</form>
</body>
</html>
3、实现视图函数(app/views.py)
from django.shortcuts import render, redirect
from django.views.generic import View
from .forms import RegisterForm
class Register(View):
TEMPLATE = 'registerForm.html'
def get(self, request):
form = RegisterForm()
return render(request, self.TEMPLATE, {'form':form})
def post(self, request):
# 两种方法均可
# 方法一
# username = request.POST.get('username')
# password = request.POST.get('password')
# print(username)
# print(password)
# return redirect('/register')
# 方法二
form = RegisterForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
print('username: ', username)
print('password: ', password)
return redirect('/register')
4、启动服务,进行访问
参考资料
https://coding.imooc.com/class/393.html