详解Django表单系统

Django表单系统是一个强大的工具,可以快速创建各种表单,包括用户注册、登录等。本文将详细介绍Django表单系统的用法,包括表单的创建、验证、视图函数的编写等。

创建表单

我们可以通过继承Django内置的forms.Form类来创建自定义表单。下面是一个简单的登录表单的示例:

from django import forms

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

这个表单有两个字段,分别是用户名和密码。CharField表示一个字符型字段,label参数指定字段在表单中的标签名称。密码字段使用了PasswordInput小部件来隐藏输入内容。

在视图函数中使用表单

一旦我们创建了表单,就可以在视图函数中使用它了。比如一个登录视图函数,可以这样编写:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from .forms import LoginForm

def login_view(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('home')
            else:
                form.add_error('username', '用户名或密码错误')
    else:
        form = LoginForm()
    return render(request, 'login.html', {'form': form})

这个视图函数首先判断请求方法是否为POST。如果是,则将提交的数据传给LoginForm实例进行表单验证。如果表单数据合法,则使用authenticate()函数进行用户认证。如果用户认证成功,则使用login()函数将用户登录,并重定向到首页。如果认证失败,则将用户名字段上添加错误提示信息。

表单验证

默认情况下,表单系统会自动验证表单数据。我们只需要在表单类中定义相应的验证规则即可。比如可以使用min_lengthmax_length属性来限制输入长度:

class RegisterForm(forms.Form):
    username = forms.CharField(min_length=3, max_length=50, label='用户名')
    email = forms.EmailField(label='邮箱')
    password1 = forms.CharField(min_length=6, label='密码', widget=forms.PasswordInput)
    password2 = forms.CharField(min_length=6, label='确认密码', widget=forms.PasswordInput)

    def clean_username(self):
        '''
        验证用户名是否已存在
        '''
        username = self.cleaned_data.get('username')
        if User.objects.filter(username=username).exists():
            raise forms.ValidationError('该用户名已存在')
        return username

    def clean(self):
        '''
        验证两次密码输入是否一致
        '''
        cleaned_data = super().clean()
        password1 = cleaned_data.get('password1')
        password2 = cleaned_data.get('password2')
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError('两次密码输入不一致')

在上面的代码中,我们定义了一个RegisterForm表单,它有四个字段。其中,username字段使用了min_lengthmax_length属性来限制输入长度。clean_username()方法验证了用户名是否已存在,如果已存在则抛出一个表单验证错误。clean()方法验证了两次密码输入是否一致,如果不一致则抛出一个表单验证错误。

表单渲染

要在模板中渲染表单,我们只需要在模板中使用Django内置的{{ form }}模板变量即可。

<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">注册</button>
</form>

as_p方法会将表单渲染为一个HTML表格,每个字段都会在一个<p>标签中。我们还可以使用as_tableas_ul方法分别将表单渲染为HTML表格和列表。

<!-- 渲染为表格 -->
<form method="post">
  {% csrf_token %}
  {{ form.as_table }}
  <button type="submit">注册</button>
</form>

<!-- 渲染为列表 -->
<form method="post">
  {% csrf_token %}
  {{ form.as_ul }}
  <button type="submit">注册</button>
</form>

注意,在渲染表单时,我们必须在表单中加入{% csrf_token %}标签,这是Django的CSRF保护措施。

结语

本文中我们介绍了使用Django表单系统的完整攻略,包括表单的创建、验证、视图函数的编写和渲染等。希望这篇文章对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Django表单系统 - Python技术站

(0)
上一篇 2023年3月12日
下一篇 2023年3月12日

相关文章

  • Python – Django – 使用 Pycharm 连接 MySQL 数据库

    在 Pycharm 的右上方找到 Database 点击 依次点击,选择 MySQL 数据库 点击 Download 下载驱动文件 下载完成后对数据库的相关信息进行填写 填写完成后点击“Test Connection”,如果出现 Successful 就说明连接成功 然后点击“应用”,再点击“确定” 左边这个窗口是写 SQL 语句的地方  例如查询 app0…

    Django 2023年4月10日
    00
  • django迁移文件migrations的实现

    下面我来详细讲解 Django 迁移文件 migrations 的实现攻略: 1. 简介 Django迁移文件migrations是Django自动化管理数据库的重要工具,它能让开发者避免手动操作数据库,提高开发效率。迁移文件在数据模型(model)发生变化时,只需要建立一个类似Git中的版本控制记录一样的迁移文件, Django就能自动采取相应的操作将数据…

    Django 2023年5月16日
    00
  • 使用pycharm创建Django项目,’django-admin’ 不是内部或外部命令

      报错信息如下:              (笔者的电脑为win10,python3.7,django 2.2.6 )      第一种情况的解决方案:没有配置环境变量,Django安装之后,需要配置环境变量,命令django-admin.pystartproject projectname才会生效,环境变量的内容就是django-admin.py文件的安…

    Django 2023年4月12日
    00
  • django-rest-framework解析请求参数

    前言 前面的文章中编写了接口, 调通了接口文档. 接口文档可以直接填写参数进行请求, 接下来的问题是如何接受参数, 由于请求方式与参数序列化形式的不同, 接收参数的方式也有不同. 前提条件 服务端我们使用django-rest-framework编写接口. class ReturnJson(APIView): coreapi_fields=( DocPara…

    Django 2023年4月12日
    00
  • 正确的理解和使用Django信号(Signals)

    理解和使用Django信号(Signals)是Python Web框架Django中很重要的一部分。这个机制可以让应用程序在发生特定的事件时就可以通知其他部分,而不需要直接调用它们,从而实现了模块之间的解耦合。下面是正确的理解和使用Django信号的完整攻略: 1. 信号简介 Django信号是一个内置的发布-订阅模型,用于解耦不同部分的应用程序。信号可以用…

    Django 2023年5月16日
    00
  • [TimLinux] django 全局变量在WSGI多进程多线程环境中的研究

    场景1: 2个进程,每个进程1个线程,请求函数中设置了10秒sleep,9个请求同一URL: 结果: 1. 全局变量ID值,在每一个进程中相同,不同进程中不相同 2. 并行只能接受2个请求,同时发起多个请求,则需要排队等待处理   场景2: 1个进程,每个进程2个线程,请求函数中设置了10秒sleep,9个请求同一URL: 结果: 1. 全局变量ID值,在单…

    Django 2023年4月13日
    00
  • django rest_framework中的APIView,ModelViewSet,认证,权限,频率,版本

    models.py from django.db import models class UserInfo(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) type_choices=((1,”普通用户”),(2,”VIP”),(3,…

    Django 2023年4月11日
    00
  • Django开发的简易留言板案例详解

    下面我详细讲解一下“Django开发的简易留言板案例详解”的完整攻略。 前言 本文主要讲解使用Django框架开发简易留言板的过程和实现步骤,旨在帮助初学者学习Django框架,并对Django框架的开发方式有一个更深入的了解。在本文中,将涉及到Django框架的环境配置、数据库的操作和后端代码的编写等内容。 环境搭建 在开始搭建环境前,我们需要确保已经在本…

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