Django 4 笔记 - 3.表单

Form的作用

许多不同类型的数据可能需要在一张表单中准备显示,渲染成HTML,使用方便的界面进行编辑,传到服务器,验证和清理数据,然后保存或跳过进行下一步处理。

Django 的表单功能可以简化和自动化上述工作的大部分内容,并且也能比大多数程序员自己编写代码去实现来的更安全些。

Django 会处理涉及表单的三个不同部分:

  • 准备并重组数据,以便下一步的渲染
  • 为数据创建HTML 表单
  • 接收并处理客户端提交的表单及数据

Django表单系统的核心组件是 Form 类。… Form 类描述一张表单并决定它如何工作及呈现。


一个简单的例子

将之前自行车的例子修改为通过表单提交 ID,然后显示对应颜色的自行车。

  1. 修改 bicycle/urls.py
from django.urls import path
from .views import MyBicycle

urlpatterns = [
    path('', MyBicycle.as_view()),
]
  1. 创建 bicycle/forms.py
from django import forms


class BicycleIdForm(forms.Form):
    bicycle_id = forms.IntegerField(
        label='Bicycle ID', 
        min_value=1, 
        max_value=3
    )

  1. 修改 bicycle/views.py (这次我们没有使用 csrf_exempt 装饰器):
from django.template.response import TemplateResponse
from django.views import View
from .forms import BicycleIdForm


class MyBicycle(View):
    color = {
        1: 'yellow',
        2: 'red',
        3: 'blue'
    }

    def get(self, request):
        form = BicycleIdForm()
        return TemplateResponse(request, 'bicycle.html', {'form': form})
    

    def post(self, request):
        form = BicycleIdForm(request.POST)
        context = {'form': form}

        if form.is_valid():
            context['color'] = self.color[form.cleaned_data['bicycle_id']]            
        
        return TemplateResponse(request, 'bicycle.html', context)
  1. 修改 bicycle/templates/bicycle.html
{% extends "base.html" %}

{% block title %}My bicycle{% endblock %}

{% block content %}
<form action="" method="post">
  {% csrf_token %}
  {{ form }}
  <input type="submit" value="Submit">
</form>
<hr>
{% if color %}
<h2>This is my <span style="color:{{ color }}">{{ color }}</span> bicycle.</h2>
<pre style="color:{{ color }}; font-family:Courier New">
                                               $"   *.      
               d$$$$$$$P"                  $    J
                   ^$.                     4r  "
                   d"b                    .db
                  P   $                  e" $
         ..ec.. ."     *.              zP   $.zec..
     .^        3*b.     *.           .P" .@"4F      "4
   ."         d"  ^b.    *c        .$"  d"   $         %
  /          P      $.    "c      d"   @     3r         3
 4        .eE........$r===e$$$$eeP    J       *..        b
 $       $$$$$       $   4$$$$$$$     F       d$$$.      4
 $       $$$$$       $   4$$$$$$$     L       *$$$"      4
 4         "      ""3P ===$$$$$$"     3                  P
  *                 $       """        b                J
   ".             .P                    %.             @
     %.         z*"                      ^%.        .r"
        "*==*""                             ^"*==*""
</pre>
{% endif %}
{% endblock %}
  1. 用浏览器打开 http://127.0.0.1:8000/bicycle/ :
    在这里插入图片描述

  2. 在表单中输入数字 3 并提交:
    在这里插入图片描述

  3. 查看页面源码,可以发现有一个 csrfmiddlewaretoken 的隐藏表单域,起到防止 跨站请求伪造攻击 的作用:

<input type="hidden" name="csrfmiddlewaretoken" value="wxSeUs7PSL...aIrmHhzrsrDaim">

总结

表单的核心功能就是对提交的数据进行校验:无论用表单提交了什么数据,一旦通过调用 is_valid() 验证成功( is_valid() 返回 True),已验证的表单数据将被放到 form.cleaned_data 字典中。这里的数据已经很好地转化为 Python 类型。

表单的另一个作用是通过模板标记简化 HTML 表单页面的书写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值