Django与网页表单

news2025/4/1 19:27:42

我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步

今天来讲一讲网页表单

网页表单又叫做HTML表单,用来处理用户从页面输入发送到服务器的数据,页面表单通常会提供复选框、单选按钮和文本字段,方便用户填写各种形式的数据。

表单内容和传输方式

1.HTML中的`<form>`标签

`<form>`标签是用来创建一个表单的。表单是一个网页上的区域,用户可以在里面输入信息,比如填写用户名、密码、地址等。这些信息可以被发送到服务器,服务器再根据这些信息做处理(比如登录、注册、提交评论等)。

2.表单的内容

表单的内容主要包括两部分:

用户输入的数据
比如:

• 文本框(`<input type="text">`):用户可以输入文字,比如用户名。

• 密码框(`<input type="password">`):用户输入密码。

• 单选按钮(`<input type="radio">`):用户选择一个选项。

• 多选框(`<input type="checkbox">`):用户可以选择多个选项。

• 下拉菜单(`<select>`):用户从下拉列表中选择一个值。

• 提交按钮(`<input type="submit">`):用户点击这个按钮,表单内容就会被发送出去。


提交数据的服务器URL

这个URL是服务器的地址,告诉浏览器表单数据要发送到哪里。在`<form>`标签中,用`action`属性来指定这个地址。例如:
 

<form action="https://example.com/submit">

这表示表单数据会被发送到`

3.提交数据的方法

提交数据的方法决定了数据是如何被发送到服务器的。这里有两种常用的方法:GET和POST。

GET方法

• 特点:数据会附加在URL后面,以查询字符串的形式发送。例如,如果你填写了一个用户名为`kimi`的表单,发送到服务器的URL可能是`

• 优点:简单,可以直接通过URL访问。

• 缺点:数据会暴露在URL中,不安全,不适合传输敏感信息(比如密码)。

POST方法

• 特点:数据不会显示在URL中,而是放在HTTP请求的正文中发送。

• 优点:更安全,适合传输大量数据或敏感信息。

• 缺点:相对复杂一些,不能直接通过URL访问。

在`<form>`标签中,用`method`属性来指定提交方法。例如:

<form action="https://example.com/submit" method="post">

这表示表单数据会通过POST方法发送到指定的URL。

4.示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>示例表单</title>
</head>
<body>
    <h2>用户注册表单</h2>
    <form action="https://example.com/submit" method="post">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" required><br><br>
        
        <label for="password">密码:</label>
        <input type="password" id="password" name="password" required><br><br>
        
        <label for="email">邮箱:</label>
        <input type="email" id="email" name="email"><br><br>
        
        <label for="gender">性别:</label>
        <input type="radio" id="male" name="gender" value="male">
        <label for="male">男</label>
        <input type="radio" id="female" name="gender" value="female">
        <label for="female">女</label><br><br>
        
        <label for="hobbies">爱好:</label>
        <input type="checkbox" id="reading" name="hobbies" value="reading">
        <label for="reading">阅读</label>
        <input type="checkbox" id="traveling" name="hobbies" value="traveling">
        <label for="traveling">旅行</label>
        <input type="checkbox" id="sports" name="hobbies" value="sports">
        <label for="sports">运动</label><br><br>
        
        <label for="bio">个人简介:</label><br>
        <textarea id="bio" name="bio" rows="4" cols="50"></textarea><br><br>
        
        <input type="submit" value="提交">
        <input type="reset" value="重置">
    </form>
</body>
</html>

如何在Django构建表单

假设页面结构如下:

myproject/                     # 项目根目录
│
├── myproject/                 # 项目配置目录
│   ├── __init__.py            # 初始化文件
│   ├── settings.py            # 项目配置文件
│   ├── urls.py                # 项目 URL 配置
│   ├── wsgi.py                # WSGI 配置(用于部署)
│   └── asgi.py                # ASGI 配置(用于异步部署)
│
├── myapp/                     # 应用目录
│   ├── __init__.py            # 初始化文件
│   ├── admin.py               # Django 管理后台配置
│   ├── apps.py                # 应用配置
│   ├── models.py              # 数据库模型定义
│   ├── tests.py               # 测试文件
│   ├── views.py               # 视图逻辑
│   ├── forms.py               # 表单定义
│   ├── templates/             # 模板文件目录
│   │   └── register.html      # 注册页面模板
│   └── static/                # 静态文件目录(可选)
│       ├── css/               # CSS 文件
│       ├── js/                # JavaScript 文件
│       └── images/            # 图片文件
│
├── manage.py                  # Django 管理脚本
├── db.sqlite3                 # 默认数据库文件(SQLite)
└── requirements.txt           # 项目依赖文件(可选)

在 Django 中,处理表单数据并存储到数据库的过程更加简洁和高效,因为它提供了许多内置的机制来帮助开发者完成这些任务。

1.Django 中的表单处理流程

在 Django 中,处理表单数据并存储到数据库主要涉及以下几个部分:

(1)模型(Model)


模型是 Django 中用来定义数据库表结构的类。它定义了数据库中表的字段和类型。例如,一个用户模型可能如下所示:

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100, unique=True)  # 用户名字段
    password = models.CharField(max_length=100)  # 密码字段


(2)表单(Form)


Django 提供了一个强大的表单系统,可以用来处理用户输入的数据。你可以通过定义一个表单类来指定哪些字段需要用户输入,并进行验证。例如:
 

from django import forms

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

(3)视图(View)


视图是 Django 中用来处理请求和响应的逻辑部分。它接收用户的请求,处理表单数据,并将数据存储到数据库中。例如:

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegistrationForm
from .models import User

def register(request):
    if request.method == "POST":
        form = UserRegistrationForm(request.POST)  # 创建表单实例并填充数据
        if form.is_valid():  # 验证表单数据
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']

            # 检查用户名是否已存在
            if User.objects.filter(username=username).exists():
                messages.error(request, "用户名已存在")
            else:
                # 创建用户并存储到数据库
                User.objects.create(username=username, password=password)
                messages.success(request, "注册成功")
                return redirect("login")  # 跳转到登录页面
    else:
        form = UserRegistrationForm()  # 如果是GET请求,创建一个空表单

    return render(request, "register.html", {"form": form})

(4)模板(Template)


模板是 Django 中用来渲染 HTML 页面的文件。你可以在这里定义表单的 HTML 结构,并使用 Django 的模板语言来动态生成内容。例如:

<!DOCTYPE html>
<html>
<head>
    <title>注册</title>
</head>
<body>
    <h1>注册</h1>
    <form method="post" action="">
        {% csrf_token %}  <!-- Django 的跨站请求伪造保护 -->
        {{ form.as_p }}  <!-- 渲染表单 -->
        <button type="submit">注册</button>
    </form>
</body>
</html>

Tips:区分Form和Model

在 Django 中,模型(Model)和表单(Form)可能会有一些相似的内容,但它们的作用和设计目标是不同的。虽然它们可能会有一些“重复”的字段定义,但这种重复是必要且合理的,原因在于它们的职责不同。


1.模型和表单的职责

(1)模型(Model)

• 职责:模型是 Django 的核心,用于定义数据库的结构。它描述了数据如何存储,以及数据之间的关系。

• 内容:模型字段定义了数据库表的列,例如字段类型(如`CharField`、`IntegerField`)、字段约束(如`max_length`、`unique`)等。

• 示例:
 

 from django.db import models

  class User(models.Model):
      username = models.CharField(max_length=100, unique=True)
      password = models.CharField(max_length=100)

(2)表单(Form)

• 职责:表单用于处理用户输入的数据,验证数据的合法性,并将其转换为模型可以接受的格式。

• 内容:表单字段定义了用户需要填写的内容,以及如何验证这些输入。它还负责将用户输入的数据与模型字段进行映射。

• 示例:

  from django import forms

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

2.为什么会有“重复”?


虽然模型和表单的字段定义看起来很相似,但它们的用途不同:

• 模型字段:定义了数据库表的结构,是数据存储的规范。

• 表单字段:定义了用户输入的界面和验证规则,是数据输入的规范。


(1)数据验证

• 模型验证:模型的字段约束(如`unique=True`)主要用于数据库层面的验证,确保数据在存储时符合要求。

• 表单验证:表单的验证规则(如`max_length`、`required`)主要用于用户输入层面,确保用户提交的数据在格式和内容上符合要求。


(2)数据转换


表单的作用不仅仅是验证数据,它还会将用户输入的数据转换为模型可以接受的格式。例如,表单可以处理文件上传、日期格式转换等。


3.如何减少重复?


虽然模型和表单的字段定义看起来相似,但完全避免重复是不可能的,因为它们的职责不同。不过,Django 提供了一些方法来减少这种重复:


(1)使用`ModelForm`


Django 提供了一种特殊的表单类`ModelForm`,它可以根据模型自动生成表单字段。这样可以减少手动定义字段的工作量,同时保持模型和表单的一致性。
• 示例:

  from django import forms
  from .models import User

  class UserRegistrationForm(forms.ModelForm):
      class Meta:
          model = User
          fields = ['username', 'password']  # 指定需要生成的字段
          widgets = {
              'password': forms.PasswordInput()  # 自定义密码字段的渲染方式
          }


使用`ModelForm`后,表单字段会自动从模型中生成,减少了手动定义字段的重复工作。


(2)动态字段生成


如果需要更复杂的表单逻辑,可以动态生成表单字段。例如,根据模型的字段动态添加表单字段。


(3)代码复用


在某些情况下,可以将字段定义逻辑抽象到一个单独的模块中,然后在模型和表单中复用这些逻辑。

简单来说,就是Form用于输入,model用于输出

表单处理

在 Django 中,`Form`类和`ModelForm`类是处理表单的两种主要方式。它们都用于处理用户输入和验证数据,但它们的用途和实现方式有所不同。

1.`Form`类


`Form`是 Django 提供的基础表单类,用于创建通用的表单。它不依赖于数据库模型,完全由开发者手动定义字段和验证逻辑。
特点

• 灵活性高:完全由开发者定义字段和验证规则。

• 独立于模型:不与数据库模型直接关联,适合处理与数据库无关的表单数据。

• 手动定义字段:需要显式定义每个字段及其验证规则。


适用场景

• 非数据库相关的表单:例如,搜索表单、评论表单、联系表单等。

• 复杂表单逻辑:需要自定义字段验证或处理逻辑。

• 与模型字段不完全一致的表单:例如,表单字段比模型字段多或少。

示例
 

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(label="Name", max_length=100)
    email = forms.EmailField(label="Email")
    message = forms.CharField(label="Message", widget=forms.Textarea)

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if "example.com" in email:
            raise forms.ValidationError("Please use a different email provider.")
        return email

在这个例子中,`ContactForm`是一个通用表单,完全由开发者定义字段和验证逻辑。

 

2.`ModelForm`类

`ModelForm`是 Django 提供的一种特殊的表单类,它基于数据库模型自动生成表单字段。它将模型字段直接映射为表单字段,并提供了默认的验证规则。

特点

• 自动生成字段:根据模型字段自动生成表单字段,减少重复代码。

• 与模型紧密关联:直接与数据库模型交互,方便数据的保存和更新。

• 默认验证规则:继承模型字段的验证规则(如`max_length`、`unique`等)。

• 简化开发:适用于直接与数据库模型相关的表单。


适用场景

• 与数据库模型直接相关的表单:例如,用户注册、用户编辑、文章发布等。

• 快速开发:减少手动定义字段的工作量。

• 模型字段与表单字段一致:表单字段直接对应模型字段。


示例
 

from django import forms
from .models import User

class UserRegistrationForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['username', 'password']  # 指定需要生成的字段
        widgets = {
            'password': forms.PasswordInput()  # 自定义字段渲染
        }

    def clean_username(self):
        username = self.cleaned_data.get('username')
        if User.objects.filter(username=username).exists():
            raise forms.ValidationError("This username is already taken.")
        return username



在这个例子中,`UserRegistrationForm`是一个`ModelForm`,它根据`User`模型自动生成字段,并提供了默认的验证规则。

3.`Form`类 vs.`ModelForm`类


 特性      `Form` 类      `ModelForm` 类     
 **字段定义**      手动定义每个字段      根据模型字段自动生成     
 **与模型关联**      不直接关联模型      直接关联模型,方便数据保存     
 **验证规则**      手动定义验证逻辑      继承模型字段的验证规则     
 **适用场景**      非数据库相关的表单      数据库模型相关的表单     
 **开发效率**      更灵活,适合复杂逻辑      简化开发,减少重复代码     

 

4.选择哪种表单?

• 如果你的表单字段与数据库模型字段完全一致,或者大部分一致,推荐使用`ModelForm`,因为它可以减少重复代码,简化开发流程。

• 如果你的表单与数据库模型无关,或者需要复杂的自定义逻辑(例如,表单字段与模型字段不完全一致),则推荐使用`Form`。

5.总结

• `Form`类:通用表单,手动定义字段和验证逻辑,适合与数据库无关的表单。

• `ModelForm`类:基于模型的表单,自动生成字段和验证规则,适合与数据库模型直接相关的表单。

表单集合

在需要提交多个表单的页面中,若用户多次单击“提交”按钮,则可能会给其带来不好的体验;有时候多个表单可能存在业务上的联系,一起提交这些表单是有必要的。

在 Django 中,如果你需要处理多个表单的集合(例如,同时处理多个相同类型的表单,或者不同类型的表单组合),可以使用表单集(Formset)或模型表单集(ModelFormset)。这些工具可以帮助你高效地处理多个表单的场景。


表单集(Formset)

表单集是 Django 提供的一个工具,用于处理多个相同类型的表单。它非常适合以下场景:

• 动态添加表单:用户可以根据需要动态添加或删除表单。

• 批量处理数据:例如,批量添加或编辑多个对象。


创建表单集

要创建一个表单集,你需要使用`forms.formset_factory()`方法。这个方法接受一个表单类,并返回一个表单集类。

示例:创建一个表单集
假设你有一个`ItemForm`,用于添加商品信息,现在需要同时处理多个商品的表单。

from django import forms
from django.forms import formset_factory

# 定义单个表单
class ItemForm(forms.Form):
    name = forms.CharField(label="商品名称", max_length=100)
    quantity = forms.IntegerField(label="数量", min_value=1)

# 创建表单集
ItemFormSet = formset_factory(ItemForm, extra=3)  # 默认生成 3 个表单

在这里:

• `ItemForm`是单个表单类。

• `formset_factory()`用于创建表单集。

• `extra=3`表示默认生成 3 个空表单。


在视图中使用表单集
在视图中,你可以实例化表单集,并处理用户提交的数据。

from django.shortcuts import render

def add_items(request):
    if request.method == "POST":
        formset = ItemFormSet(request.POST)  # 实例化表单集
        if formset.is_valid():
            for form in formset:
                name = form.cleaned_data.get('name')
                quantity = form.cleaned_data.get('quantity')
                # 处理每个表单的数据,例如保存到数据库
                print(f"商品名称: {name}, 数量: {quantity}")
            return render(request, "success.html")
    else:
        formset = ItemFormSet()  # 创建空表单集

    return render(request, "add_items.html", {"formset": formset})


在模板中渲染表单集
在模板中,你可以像处理普通表单一样渲染表单集。

<!DOCTYPE html>
<html>
<head>
    <title>添加商品</title>
</head>
<body>
    <form method="post">
        {% csrf_token %}
        {{ formset.management_form }}  <!-- 必须渲染管理表单 -->
        {% for form in formset %}
            <div>
                {{ form.name.errors }}
                {{ form.name }}

                {{ form.quantity.errors }}
                {{ form.quantity }}
            </div>
        {% endfor %}
        <button type="submit">提交</button>
    </form>
</body>
</html>

AJAX表单

AJAX(Asynchronous JavaScript and XML)表单是一种通过 JavaScript 在后台与服务器交互的技术,而无需重新加载整个页面。在 Web 开发中,AJAX 表单的使用可以极大地提升用户体验和页面性能。以下是 AJAX 表单的主要用处和优势:

1.提升用户体验

• 无需刷新页面:用户提交表单后,页面不会重新加载,从而减少了等待时间,让页面交互更加流畅。

• 即时反馈:可以在用户输入时即时验证数据(如检查用户名是否已存在),并立即给出反馈,而无需等待表单提交。

• 局部更新:只有表单相关的部分会更新,而不是整个页面。例如,提交评论后,评论列表会自动更新,而其他页面内容保持不变。


2.提高页面性能

• 减少数据传输:AJAX 只需要传输必要的数据(如表单内容),而不是整个页面的 HTML,从而减少了服务器和客户端之间的数据传输量。

• 异步加载:页面的其他部分可以继续加载或交互,而不会因为表单提交而被阻塞。

3.实现复杂的交互逻辑

• 动态表单:根据用户输入动态调整表单字段。例如,用户选择某个选项后,表单会动态加载相关的子选项。

• 文件上传进度条:在上传文件时,通过 AJAX 可以实时显示上传进度。

• 无限滚动和分页:在用户滚动到页面底部时,自动加载更多内容,而不是通过点击分页按钮。

4.减轻服务器压力

• 减少请求次数:通过在客户端进行部分验证(如格式校验),可以减少无效的请求发送到服务器。

• 优化数据处理:服务器只需要处理必要的数据,而不是重新渲染整个页面。

5.实现高级功能

• 实时搜索:用户输入搜索关键词时,实时返回搜索结果。

• 即时消息和通知:在后台轮询或通过 WebSocket 接收消息,实时更新通知区域。

• 表单预览:用户填写表单后,可以实时预览表单内容,而无需提交。

AJAX实现

AJAX 的实现可以有多种不同的方法,这取决于具体的应用需求、后端框架以及前端的实现方式。在 Django 中使用 AJAX 主要涉及对视图(views)和模板(templates)的改动,但也可能需要对 URL 配置进行调整以适应 AJAX 请求。以下是 AJAX 在 Django 中实现时可能涉及的几个方面:


1.视图(Views)


在 Django 中,视图函数或类需要能够处理 AJAX 请求。这通常意味着视图需要能够识别请求是否是通过 AJAX 发送的(例如,通过检查`request.is_ajax()`),并根据请求类型返回不同的响应。AJAX 视图可能返回 JSON 数据、HTML 片段或其他适合前端处理的数据格式。


示例:返回 JSON 数据

from django.http import JsonResponse

def my_ajax_view(request):
    if request.is_ajax() and request.method == 'POST':
        # 处理 AJAX POST 请求
        data = {'key': 'value'}
        return JsonResponse(data)
    else:
        # 处理非 AJAX 请求或 GET 请求
        return render(request, 'my_template.html')


2.模板(Templates)


模板中需要包含用于发送 AJAX 请求的 JavaScript 代码。这通常涉及到使用`fetch`API、`XMLHttpRequest`或者库如 jQuery 来发送异步请求。模板还可能包含用于显示 AJAX 请求结果的 HTML 结构。

示例:使用 jQuery 发送 AJAX 请求

<!-- my_template.html -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
    $('#myForm').on('submit', function(e) {
        e.preventDefault();
        $.ajax({
            url: '{% url "my_ajax_view" %}',
            type: 'POST',
            data: $(this).serialize(),
            success: function(response) {
                // 处理成功响应
                console.log(response);
            },
            error: function() {
                // 处理错误响应
                alert('Error!');
            }
        });
    });
});
</script>

<form id="myForm">
    <!-- 表单字段 -->
    <button type="submit">Submit</button>
</form>


3.URL 配置(URLs)


在 Django 的 URL 配置中,需要定义一个路径来映射到处理 AJAX 请求的视图。


示例:配置 URL

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('ajax/', views.my_ajax_view, name='my_ajax_view'),
]


 

4.CSRF 保护


由于 AJAX 请求通常涉及到跨站请求,因此需要确保 AJAX 请求遵循 Django 的 CSRF 保护机制。这可能涉及到在 AJAX 请求中包含 CSRF token。


示例:在 AJAX 请求中包含 CSRF token

<script>
function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

$(document).ready(function() {
    $('#myForm').on('submit', function(e) {
        e.preventDefault();
        const csrftoken = getCookie('csrftoken');
        $.ajax({
            url: '{% url "my_ajax_view" %}',
            type: 'POST',
            data: $(this).serialize(),
            headers: {
                'X-CSRFToken': csrftoken
            },
            success: function(response) {
                // 处理成功响应
                console.log(response);
            },
            error: function() {
                // 处理错误响应
                alert('Error!');
            }
        });
    });
});
</script>

验证码

验证码(CAPTCHA)是一种区分用户是人类还是自动化程序的公共全自动程序,主要用于防止恶意软件、机器人程序等对网络服务进行滥用。验证码的原理主要基于人类和计算机在某些认知能力上的差异。以下是验证码的几种常见类型及其原理:


1.图形验证码

• 原理:利用人类的视觉识别能力。图形验证码通常包含字母、数字、线条、点状干扰等元素,这些元素经过扭曲、变形或叠加干扰后,人类可以通过视觉和经验识别出其中的字符,但计算机程序很难准确识别。

• 实现方式:通过图像处理算法生成复杂的背景、扭曲的字符和干扰元素,使得计算机难以通过简单的图像识别算法(如光学字符识别OCR)解析出正确的字符。


2.滑块验证码

• 原理:基于人类的鼠标操作行为。滑块验证码要求用户将一个滑块拖动到指定位置,完成拼图或解锁操作。计算机程序很难模拟人类自然的鼠标拖动轨迹,因为人类的拖动轨迹通常具有随机性和不规则性,而机器人程序的轨迹往往是直线或过于规律。

• 实现方式:通过检测鼠标轨迹的加速度、速度变化、停留时间等行为特征来判断是否为人类操作。


3.文字验证码

• 原理:利用人类的语言理解能力。文字验证码可能是一个问题(如“2+2等于多少?”)、一个句子(如“请写出‘春天’的反义词”),或者是一段需要用户阅读并理解的内容。计算机程序很难像人类一样理解自然语言的语义。

• 实现方式:通过设计具有一定难度的语言问题,或者利用自然语言处理(NLP)技术检测用户输入是否符合预期答案。


4.声音验证码

• 原理:利用人类的听觉识别能力。声音验证码通过播放一段包含数字或字母的音频,要求用户输入听到的内容。计算机程序很难准确识别经过噪声干扰或语音合成的声音。

• 实现方式:通过添加背景噪音、语音合成技术或改变语速等方式增加识别难度。


5.行为验证码

• 原理:基于用户的行为特征。这种验证码通过分析用户的操作习惯(如点击速度、输入节奏、页面停留时间等)来判断是否为真实人类。

• 实现方式:在用户操作过程中收集行为数据,并通过机器学习算法进行分析和判断。


6.无感知验证码

• 原理:通过后台的用户行为分析,无需用户主动进行验证操作。这种验证码会根据用户的设备指纹、网络环境、历史行为等信息,判断用户是否为真实人类。

• 实现方式:结合大数据分析和机器学习模型,对用户的设备和行为进行综合评估。


验证码的核心在于利用人类的某些独特能力(如视觉、语言理解、行为习惯等),这些能力是计算机难以模拟的。通过设计复杂的验证任务,验证码能够有效区分人类用户和自动化程序,从而保护网络服务的安全性。

然而,随着人工智能和机器学习技术的发展,验证码的安全性也面临着新的挑战。例如,深度学习算法可能通过大量的样本训练来识别图形验证码,或者通过模拟人类行为来通过滑块验证码。因此,验证码技术也在不断更新和改进,以应对新的威胁。

表单验证码实现:

在开源社区当中有很多Django验证码的实现工具,这里选取 django-simple-captcha:
 

pip install django-simple-captcha

需要注意的是,django-simple-captcha依赖PIL和Pillow生成图像,需要在系统中安装libz库、jpeg库和libfreetype库。

然后将captcha添加到settings.py文件中的INSTALLED_APPS列表中。将captcha模型应用到数据库,并在urls.py当中添加相关的配置

python manage.py migrate
urlpatterns += [
    url(r'^captcha/', include('captcha.urls')),
]

想要在代码当中应用captcha,只需要定义完表单类之后加一个Captcha字段就好,示例代码如下:

from django import forms
from product.models import Product
from captcha.fields import CaptchaField  # 引入CaptchaField

class CaptchaProductForm(forms.ModelForm):
    captcha = CaptchaField()  # 验证码字段

    class Meta:
        model = Product

然后再对视图函数作出更改:

from django.shortcuts import render
from django.http import HttpResponse
from .forms import CaptchaProductForm

def update_product(request):
    if request.method == "POST":
        form = CaptchaProductForm(request.POST)
        if form.is_valid():
            # 如果通过验证,说明验证码正确,数据也正确
            human = True
            # 这里可以添加更新产品的逻辑
            return HttpResponse("更新成功")
        else:
            # 生成带有验证码的表单
            form = CaptchaProductForm()
            return render(request, 'update_product.html', {'form': form})
    else:
        # 如果不是POST请求,生成一个空表单
        form = CaptchaProductForm()
        return render(request, 'update_product.html', {'form': form})

解释:
1. 导入模块:

• `from django.shortcuts import render`:导入Django的`render`函数,用于生成HTTP响应。

• `from django.http import HttpResponse`:导入`HttpResponse`,用于返回简单的HTTP响应。

• `from .forms import CaptchaProductForm`:从当前应用的`forms`模块中导入`CaptchaProductForm`表单类。


2. 函数定义:

• `def update_product(request):`:定义一个视图函数`update_product`,接受一个`request`对象作为参数。


3. 处理POST请求:

• `if request.method == "POST":`:检查请求方法是否为POST。

• `form = CaptchaProductForm(request.POST)`:实例化`CaptchaProductForm`,传入POST请求的数据。

• `if form.is_valid():`:检查表单数据是否有效。

• `human = True`:如果表单验证通过

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatDBA VS DeepSeek:快速诊断 OceanBase 集群新租户数据同步异常

社区王牌专栏《一问一实验&#xff1a;AI 版》改版以来已发布多期&#xff08;51-60&#xff09;&#xff0c;展现了 ChatDBA 在多种场景下解决问题的效果。 下面让我们正式进入《一问一实验&#xff1a;AI 版》第 62 期&#xff0c;看看 ChatDBA 最新效果以及与热门大模型 De…

Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)

一、 高斯滤波 边缘检测本身属于锐化操作&#xff0c;对噪点比较敏感&#xff0c;所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。 二、计算图像的梯度和方向 三、非极大值抑制 在得到每个边缘的方向之后&#xff0c;其实把它们连起来边缘检测就算完了…

基于Kubernetes部署Prometheus监控平台

#作者&#xff1a;stackofumbrella 文章目录 prometheus和k8s集群版本对照表架构Prometheus Operator简介kube-prometheus下载地址 安装修改镜像地址修改Prometheus的service修改Grafana的service修改Alertmanager的service数据持久化执行安装 Prometheus验证Grafana验证解决C…

往期项目shader着色器实践效果应用合集

1、管路混色 2、水管水流效果 3、水管流入到流完效果 4、加热冷却 两 色混色 示意 XX、毒蘑菇测试效果

绿色暴政:Relax Max如何用军工科技定义环保新标准

《绿色暴政&#xff1a;Relax Max如何用军工科技定义环保新标准》 ——从隐形战斗机涂层到零碳卫浴的降维打击 &#xff08;洛克希德马丁实验室&#xff0c;2023年&#xff09;当F-35战斗机的隐形涂料配方被改写为卫浴釉料时&#xff0c;环保产业迎来了最硬核的颠覆者。Relax…

第十三届蓝桥杯单片机省赛程序设计试题

目录 试题 各程序块代码 init.c main.c other.h other.c key.c seg.c onewire.c部分 ds1302.c部分 试题 各程序块代码 init.c #include "other.h"void init74hc138(unsigned char n){P2(P2&0x1f)|(n<<5);P2&0x1f; } void init(){P00x00;in…

QOpenGLWidget动态加载功能实现教程(Qt+OpenGL)

QOpenGLWidget动态加载功能实现教程 我需要在Qt里面使用QOpenGLWidget显示OpenGL窗口&#xff0c;并且需要实现加载模型后重新渲染更新窗口的功能&#xff0c;但是一直无法更新被卡住了&#xff0c;现在把问题解决了总结一下整个实现过程。 创建一个自己的OpenGLWidget类 QOp…

ESP32驱动BMP280和MQ4传感器

文章目录 前言 一、硬件准备 所需组件 连接方式&#xff1a; 二、软件实现 1.所需库 2.代码实现 效果演示 三、上传Qt端 前言 在物联网和环境监测应用中&#xff0c;传感器是获取环境数据的关键组件。本文将详细介绍如何使用ESP32微控制器同时驱动BMP280大气压力传感器…

MQTT协议笔记

消息格式 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议&#xff0c;专为低带宽、高延迟或不可靠的网络设计&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;设备之间的通信。MQTT消息体的结构遵循MQTT协议规范&#xff0…

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…

如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志

一、首先按照以下 指引 中的 第1、2步骤&#xff0c;安装一下 AGDE &#xff0c;AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension&#xff08;AGDE&#xff09;对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前&#xff0c;记得…

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权相关工具类代码

系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也称为门控循环单元&#xff0c;是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c;通过引入两个&qu…

【大模型基础_毛玉仁】3.4 Prompt 技巧

目录 3.4 Prompt 技巧3.4.1 规范Prompt 编写1&#xff09;任务说明要明确2&#xff09;上下文丰富且清晰3&#xff09;输出格式要规范4&#xff09;排版要清晰 3.4.2 合理归纳提问1&#xff09;复杂问题拆解2&#xff09;追问 3.4.3 适时使用CoT1&#xff09;何时使用CoT2&…

探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率

随着分子建模和计算生物学的快速发展&#xff0c;分子对接&#xff08;Molecular Docking&#xff09;、结合位点预测、相互作用分析以及动力学研究等领域的工具越来越重要。这些工具不仅帮助研究人员理解分子间的相互作用机制&#xff0c;还能加速药物设计和优化过程。NRGSuit…

wokwi arduino mega 2560 - 键盘与LCD显示

截图&#xff1a; 链接&#xff1a; https://wokwi.com/projects/414520193913760769 代码&#xff1a; //cslg lcd key #include <LiquidCrystal.h> // 引入LiquidCrystal库&#xff0c;用于LCD显示 #include <Keypad.h> // 引入Keypad库&#xff0c;用于键盘输…

Linux设置SSH免密码密钥登录

文章目录 设置SSH免密码密钥登录第一步&#xff1a; 生成SSH密钥对&#xff08;在客户端操作&#xff09;方式一&#xff1a;Windows 10/11 内置的 OpenSSH 客户端&#xff08;推荐&#xff09;常用选项&#xff1a;密钥算法选择建议生成秘钥 方式二&#xff1a;借用Xshell工具…

深度剖析HTTP协议—GET/PUT请求方法的使用-构造请求的方法

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…