详解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日

相关文章

  • Django数据迁移时提示 ModuleNotFoundError: No module named ‘users’

    执行数据迁移时提示找不到对应的APP,错误如下:这个错误主要是路径找不到引起的,只需在settings文件夹中添加app文件路径即可 sys.path.insert(0, os.path.join(BASE_DIR, ‘apps’))

    Django 2023年4月12日
    00
  • django Form 效验

    Django 登入效验 .py from django import forms from student import models from django.core.exceptions import ValidationError from django.core.validators import RegexValidator class RegFo…

    Django 2023年4月10日
    00
  • django 執行數據遷移 報錯:HINT: Add or change a related_name argument to the definition for ‘User.user_permissions’ or ‘User.u

    解決方法: 1.在項目的settings 中,添加 AUTH_USER_MODEL=”users.UserProfile”#app名稱下的UserProfile 類其中 users 表示 你的app;UserProfile 表示你在models下 創建的類然後再執行 makemigrations users migrate users 即可 如圖:  

    Django 2023年4月12日
    00
  • Django 1.8 admin 产生’WSGIRequest’ object has no attribute ‘user’的错误

        配置admin时,产生’WSGIRequest’ object has no attribute ‘user’的错误   google了下,说是MIDDLEWARE配置的有问题,顺序应该保持参见(http://stackoverflow.com/questions/26576192/wsgirequest-object-has-no-attribut…

    Django 2023年4月15日
    00
  • Django3中的自定义用户模型实例详解

    下面我会详细讲解“Django3中的自定义用户模型实例详解”的完整攻略,过程中将会包含两条示例说明。 什么是Django3中的自定义用户模型? 在Django3中,用户模型是一个具有以下属性的模型: 用户名 电子邮件地址 密码 是否是超级用户 除此之外,还可以添加其他自定义字段。当创建一个新的Django3项目时,会自动创建一个名为User的用户模型。但是,…

    Django 2023年5月16日
    00
  • Django框架 信号调度原理解析

    Django框架 信号调度原理解析 什么是信号 在Django框架中,信号是一种轻量级的通信机制,在模型的某个事件发生时,允许接收信号的函数被调用。信号接收器是用于在特定时间监听特定模型的函数。 信号的作用 信号的主要作用就是当模型发生变化时自动调用某些函数,在特定的时间做一些特定的操作,比如在某个模型的数据被更新时,自动发送邮件通知相关的人员。 信号的种类…

    Django 2023年5月16日
    00
  • 详解Python网络框架Django和Scrapy安装指南

    详解Python网络框架Django和Scrapy安装指南的完整攻略如下: 1. 安装Python Django和Scrapy都是基于Python的框架,所以首先需要在电脑上安装Python。安装Python的方法有多种,可以到Python官网下载最新版本的Python安装包进行安装,也可以使用包管理器安装。这里以Windows操作系统为例,介绍Window…

    Django 2023年5月16日
    00
  • Django REST Framework教程:快速入门

    我们将创建一个简单的允许管理员用户查看和编辑系统中的用户和组的API。 项目设置 利用pycharm创建一个名为 tutorial 的新django项目,并创建一个名为 quickstart 的新app。   目录结构        在创建的虚拟环境中安装Django REST framework pip install djangorestframewor…

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