Django中Forms的使用代码解析

我来详细讲解一下“Django中Forms的使用代码解析”的攻略,包含两条示例说明。

一、什么是Django Forms

Django Forms是用来收集并验证用户提交数据的工具,在Django中使用Forms可以方便地快速创建表单并进行表单的各项验证。Django Forms常用于与View视图函数一起配合使用,从而实现表单的各种处理功能。

二、Django中Forms的使用方法

在Django中,我们需要定义一个Form类来实现表单的设计和配置。这个Form类需要继承自django.forms.Form。通过在Form类中定义各个FormField可以实现对表单各个字段的定义和约束条件。

2.1 示例1:表单提交验证

在Django中,我们可以通过FormField对象构建出需要的表单字段。

以一个表单类中定义的"username"字段为例:

class LoginForm(forms.Form):
    username = forms.CharField(label="用户名", max_length=50)
    password = forms.CharField(label="密码", widget=forms.PasswordInput())

在上面的代码中,我们创建了一个叫做LoginForm的Form类,并在它的内部定义了两个字段,分别是“username”和“password”。其中,通过forms.CharFieldforms.PasswordInput指定了这两个字段的属性,其中“username”字段的最大长度不能超过50,而“password”字段是使用PasswordInput来掩盖明文的密码内容进行展示。

接着,在我们编写完表单类之后,需要在View视图函数中进行表单验证以及其他相关操作。在下面的示例中,我们编写了一个视图函数,用于处理用户提交的表单数据。

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse

def login(request):
    """
    用户登录
    """
    if request.method == "GET":
        form = LoginForm()
        return render(request, "login.html", {"form": form})
    elif request.method == "POST":
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data["username"]
            password = form.cleaned_data["password"]
            ...
        else:
            return render(request, "login.html", {"form": form})

在上面的代码中,我们首先判断请求的方式是GET还是POST。如果是GET请求,那么直接返回空的表单HTML页面;如果是POST请求,那么就根据用户提交的数据来进行表单验证。

在表单验证部分,我们首先通过LoginForm(request.POST)来构建一个表单对象,并通过form.is_valid()来进行表单验证。如果验证通过,那么我们就可以通过form.cleaned_data属性来获取到用户提交的数据,进而进行下一步操作,如重定向到成功页面;如果验证不通过,那么我们就需要将错误信息返回给前端并展示。

2.2 示例2:表单处理

除了表单提交验证之外,当然还有很多更加复杂并且实用的表单处理操作,比如说对表单的文件上传、通过AJAX技术进行表单的异步交互等等。

在下面示例中,我们以AJAX为例来说明Django中如何实现异步表单提交的处理。

首先,在前端页面中,我们需要使用AJAX来处理表单的异步提交;然后在后端,则使用Django来对提交的表单内容进行处理。具体如下:

前端示例代码:

  <form id="photoForm" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="photo" id="fileUpload" style="display:none">
    <label for="fileUpload" id="uploadButton">上传头像</label>
    <button id="submitForm">提交</button>
  </form>

  <script type="text/javascript">
      document.getElementById("fileUpload").onchange = function () {
          document.getElementById("photoForm").submit();
      }
      document.getElementById("submitForm").onclick = function (event) {
          event.preventDefault();
          $.ajax({
              type: "POST",
              url: "/upload/",
              data: $('#photoForm').serialize(),
              success: function () {
                  alert("上传成功");
              },
              error: function () {
                  alert("上传失败");
              }
          });
      }
  </script>

在上面的代码中,我们定义了一个表单区域,通过AJAX来异步的提交数据。你可以看到,在点击按钮时触发了一个AJAX请求,并将提交的数据使用serialize()方法序列化处理。

同时,需要注意的是,由于我们这里使用了CSRF防护机制来保障Web应用的安全性,在上面的表单中,需要加入{% csrf_token %}语句来确保执行这一机制。

后端示例代码:

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

# 禁用CSRF防护机制
@csrf_exempt
def upload(request):
    if request.method == "POST":
        # 获取文件
        file = request.FILES.get("photo", None)
        if not file:
            return JsonResponse({"msg": "文件不存在"})
        # 对文件进行处理
        file_path = handle_uploaded_file(file)
        return JsonResponse({"msg": "文件上传成功", "url": file_path})
    else:
        return JsonResponse({"msg": "请求类型错误"})

# 处理上传文件的函数
def handle_uploaded_file(file):
    # ...
    return file_path

在上面的后端代码中,我们可以看到,我们需要使用到两个库,“JsonResponse”和“csrf_exempt”。前者是Django内置的HTTP响应对象,用于构建一个强制转换为JSON格式的HTTP响应体;后者则是Django所提供的CSRF防护机制,我们需要将其禁用以方便进行异步表单提交处理。

函数upload()用于处理表单的异步上传操作。在函数内部中,我们首先判断请求的类型是否为POST,如果是POST请求,那么就需要获取请求中的文件内容,并对其进行处理。处理完成后,我们就可以通过JsonResponse返回处理结果,完成整个异步表单提交的操作。

至此,我们就完成了Django中使用Forms进行表单处理的两个示例操作。这其中包括:表单提交验证和表单处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django中Forms的使用代码解析 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • django与python版本对应关系 附加djangorestframework框架

    Django与python版本 Django 1.11版本兼容Python 2.7、3.4、3.5、3.6、3.7(added in 1.11.17)# 1.11.5 python<=3.6 Django 2.0版本兼容Python 3.4、3.5、3.6、3.7 Django 2.1、2.2版本兼容Python 3.5、3.6、3.7 Django …

    Django 2023年4月13日
    00
  • Pyinstaller打包django

    偶有特殊要求可能需要将django程序打包成exe可执行文件,方便在电脑直接点击运行。这里用的是打包python代码的常用库Pyinstaller. 虽然用Pyinstaller支持打包Django,但也存在一些坑,在此记录一下。 环境: Python 3.6 Django 2.0 Pyinstaller 3.4 打包开始之前,先确定写的django程序能否…

    Django 2023年4月11日
    00
  • pycharm断点调试django

    1、打开你的工程,在菜单栏里找到Run–>Edit Configurations 2、在打开的对话框里边选择Python,点击”+”号 3.选择python 4、出现了一个新的项Unnamed,你可以把它改名叫debug,好听一点 5、脚本选择你网站的manage.py,脚本参数用runserver,跟你平常用命令行是一样的,聪明的同学应该已经发现了…

    Django 2023年4月13日
    00
  • 关于django 数据库迁移(migrate)应该知道的一些事

    那我来详细讲解关于Django数据库迁移(Migrate)需要知道的一些事情及相关示例。 概述 Django的ORM(Object-Relational Mapping,对象关系映射)是非常强大的,它允许我们在Django项目中使用Python对象操作数据库。当我们创建一个Django应用时,我们需要定义模型(Model),Django会自动将它们映射为关系…

    Django 2023年5月16日
    00
  • windows10+apache2.4+python3.6部署Django2.2.4项目

    刚从家回来,老师让写专利,就开始准备写,初稿交给老师后,把我说了一顿,我就想着回去改呀,然后。。。老师找到了我,说是食品院那急需一个展示数据的平台,然我尽快干出来,我也是菜鸟啊,就没单独干过呀,即使是一个展示数据,上一次的海底捞的还是师兄搭好框架,我们在上面改的,也遇到了不少坑,详见我的github:http://JadenFK.github.io 还好前几…

    2023年4月9日
    00
  • django-vue项目部署

    上线部署准备工作 安装mysql 安装redis   安装: apt-get install redis-server  从进程中查看是否启动: ps -aux|grep redis 端口 6379 安装nginx   安装: sudo apt install nginx​   systemctl status nginx 查看nginx的状态   syst…

    2023年4月10日
    00
  • Django笔记十八之save函数的继承操作和指定字段更新等实例方法

    本文首发于微信公众号:Hunter后端 原文链接:Django笔记十八之save函数的继承操作和指定字段更新等实例方法 这篇笔记主要介绍 Django 一些实例方法。 什么是 实例,我们知道通过filter() 的一些筛选方法,得到的是 QuerySet,而 QuerySet 取单条数据,通过索引,或者 first() 或者 last() 等方法,得到的单条…

    2023年4月10日
    00
  • Django中的session用法详解

    Django中的session用法详解 什么是Session? Session是一种客户端与服务器端的会话机制。通过Session,服务器能获得客户端的信息,从而帮助客户端完成特定需要实现的操作。在Django中,Session变量是一个字典,保存跨请求的数据。 如何开启session功能? Django中,session功能是默认开启的。只需要在Setti…

    Django 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部