Django Web 极简教程(六)- Django Form(Part A)

4,460 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

一、Form 表单

普通 Form 表单

表单是在浏览器中用于收集后端需要的信息并提交给后端的一个工具,常见的表单如:登录表单、注册表单、请假表单等,表单分为四个部分:表单提交地址、表单提交方法、表单组件、表单提交按钮。

  • <form action="#" method="POST">:action 属性用来定义表单信息提交的地址,method 属性用来定义提交的方式
  • <input type=text />:输入框,用来收集提交到后端的信息
  • <input type="submit" value="登录">:提交按钮,类型为 submit

image.png

Django Form 表单

类似 Flask 集成的 WTForms,Django Form 也可以模拟生成前端的 HTML 表单,而无须手动书写,并且支持表单信息的验证

使用 PyCharm 创建一个新的项目 Django 项目 django_forms,并创建应用 lima

image.png

PyCharm 已经自动配置好了模板所在目录

image.png

在 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/

image.png

PyCharm 控制台输出 ”这是处理 GET 请求的方法“,通过调用 Register 视图类的 get 方法进入到注册页面。

image.png

在视图类中的 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)

在表单中填入数据

image.png

点击注册按钮,页面出现了 CSRF 的报错 image.png

在 register.html 的表单中添加 {% csrf_token %} 解决 CSRF 报错,再次输入数据,点击注册按钮,控制台中输出了表单提交的信息

image.png

之后就可以根据表单提交的信息与数据库交互执行 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/

image.png

通过 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 中提交的数据

image.png