一、Form 表单
普通 Form 表单
表单是在浏览器中用于收集后端需要的信息并提交给后端的一个工具,常见的表单如:登录表单、注册表单、请假表单等,表单分为四个部分:表单提交地址、表单提交方法、表单组件、表单提交按钮。
- <form action="#" method="POST">:action 属性用来定义表单信息提交的地址,method 属性用来定义提交的方式
- <input type=text />:输入框,用来收集提交到后端的信息
- <input type="submit" value="登录">:提交按钮,类型为 submit
Django Form 表单
类似 Flask 集成的 WTForms,Django Form 也可以模拟生成前端的 HTML 表单,而无须手动书写,并且支持表单信息的验证
使用 PyCharm 创建一个新的项目 Django 项目 django_forms,并创建应用 lima
PyCharm 已经自动配置好了模板所在目录
在 lima 应用中创建 urls.py
from django.urls import path from lima import views urlpatterns = [ ] 复制代码
在根 urls.py 中添加 lima 应用的路由
from django.contrib import admin from django.urls import path, include from lima import urls as lima_urls urlpatterns = [ path('admin/', admin.site.urls), path('lima/', include(lima_urls)) ] 复制代码
在 lima 应用中的 views.py 中定义一个视图类 Register,并在该类中定义 get 和 post 方法。
from django.shortcuts import render from django.views.generic import View class Register(View): TEMPLATE = 'register.html' def get(self, request): print('这是处理 GET 请求的方法') return render(request, self.TEMPLATE) def post(self, request): print('这是处理 POST 请求的方法') return render(request, self.TEMPLATE) 复制代码
在该应用的 urls.py 中增加路由
# 其余代码不变 urlpatterns = [ path('register/', views.Register.as_view(), name='register') ] 复制代码
在 templates 目录下新增 register.html 页面,在 body 标签中增加如下内容:
<h2>注册表单</h2> <form action="{% url 'register' %}" method="post"> 用户名:<input type="text" name="username"> <br> 密码:<input type="password" name="password"> <br> <input type="submit" value="注册"> </form> 复制代码
启动 Django 应用,浏览器访问 /lima/register/
PyCharm 控制台输出 ”这是处理 GET 请求的方法“,通过调用 Register 视图类的 get 方法进入到注册页面。
在视图类中的 post 方法获取表单中传来的数据
def post(self, request): print('这是处理 POST 请求的方法') username = request.POST.get('username') password = request.POST.get('password') print('表单中传来的 username 为 {}, password 为 {}'.format(username, password)) return render(request, self.TEMPLATE) 复制代码
在表单中填入数据
点击注册按钮,页面出现了 CSRF 的报错
在 register.html 的表单中添加 {% csrf_token %}
解决 CSRF 报错,再次输入数据,点击注册按钮,控制台中输出了表单提交的信息
之后就可以根据表单提交的信息与数据库交互执行 CRUD 操作了
使用 Django 表单代替 HTML 表单
在 lima 应用中新增 forms.py,在该文件中新增一个 RegisterForm 类继承 Form 类
from django import forms from django.forms import fields class RegisterForm(forms.Form): username = fields.CharField(max_length=10, required=True) password = fields.CharField(widget=forms.PasswordInput) 复制代码
在视图类 Register 中实例化 RegisterForm 并返回到前端的 register_form.html 中
# 其余代码保持不变 class Register(View): # TEMPLATE = 'register.html' TEMPLATE = 'register_form.html' def get(self, request): print('这是处理 GET 请求的方法') register_form = forms.RegisterForm() return render(request, self.TEMPLATE, {'register_form': register_form}) 复制代码
在 templates 文件夹中新增 register_form.html,并渲染后端传来的 Django Form
<form action="{% url 'register' %}" method="post"> {% csrf_token %} {{ register_form.as_table }} <input type="submit" value="注册"> </form> 复制代码
重新启动应用,浏览器访问 /lima/register/
通过 Django Form 渲染出来的表单成功展示出来,修改视图类 Register 的 post 方法,获取 Django Form 提交的信息
class Register(View): # 其余代码保持不变 def post(self, request): print('这是处理 POST 请求的方法') # username = request.POST.get('username') # password = request.POST.get('password') register_form = forms.RegisterForm(request.POST) username = register_form.cleaned_data.get("username") password = register_form.cleaned_data.get("password") print('Django 表单中传来的 username 为 {}, password 为 {}'.format(username, password)) return render(request, self.TEMPLATE) 复制代码
在 Django Form 中填入数据并点击注册按钮,控制台成功输出Django Form 中提交的数据