Python Django框架中表单的用法详解

接下来我会详细讲解“Python Django框架中表单的用法详解”的完整攻略,包括两条示例说明。

什么是表单

表单是网页中最常见的交互方式,用户可以在表单中输入数据并提交到服务器进行处理。在 Django 框架中,可以通过表单生成 HTML 标签,还能够验证用户输入的数据,为后续的处理提供基础。下面是在 Django 中使用表单的步骤。

创建表单

在 Django 中创建表单的方法如下:

  1. 创建一个 forms.py 文件,通过导入 forms 模块来定义表单类。
from django import forms

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

上面的代码创建了一个名为 LoginForm 的表单类,包括两个字段:usernamepassword。其中,usernamepassword 都是 CharField 类型,分别表示用户名和密码。label 属性用于设置字段的标签,max_length 属性表示输入数据的最大长度,widget 属性用于设置字段的类型,这里使用了密码输入框。

  1. 在视图函数中实例化表单,并将表单实例作为参数传递给模板。
from django.shortcuts import render
from .forms import LoginForm

def login(request):
    form = LoginForm()
    return render(request, 'login.html', {'form': form})

上面的代码创建了一个名为 login 的视图函数,该函数在用户访问登录页面时被调用。在函数内部,我们创建了 LoginForm 的实例,并将该实例添加到 render 函数的第三个参数中。在模板中,我们可以通过 form 变量获取表单实例,并在 HTML 中渲染表单。

验证表单

在 Django 中验证表单的方法如下:

  1. 在 forms.py 中重写 clean() 方法。
class LoginForm(forms.Form):
    def clean(self):
        cleaned_data = super().clean()
        username = cleaned_data.get('username')
        password = cleaned_data.get('password')
        if not username or not password:
            raise forms.ValidationError("用户名或密码不能为空")

LoginForm 类中,我们重写了 clean() 方法。 clean() 方法用于实现表单数据的验证,返回一个字典数据,字典的键是表单的每个字段名,值是表单字段输入的数据。 clean() 方法的操作应该是将输入的数据与验证规则和业务规则进行比对,如数据类型、长度、是否重复等等。在上面的代码中,我们获取了表单中的 usernamepassword 的值,并检查它们是否为空。如果其中之一为空,则抛出验证错误。

  1. 在视图函数中进行表单数据验证。
def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            # 执行其它的登录操作
            return HttpResponse("登录成功")
    else:
        form = LoginForm()
    return render(request, 'login.html', {'form': form})

在视图函数中,我们首先判断请求的方法是否为 POST 方法,如果是,则实例化表单,并调用 is_valid() 方法判断输入数据是否符合验证规则。如果验证成功,我们可以通过 cleaned_data 属性获取表单输入的数据,在此处可以执行该表单相关的业务操作。

示例

下面是两个在 Django 中使用表单的示例:

  1. 实现一个注册表单

在 forms.py 文件中添加以下代码:

class SignupForm(forms.Form):
    username = forms.CharField(max_length=30, label='用户名')
    email = forms.EmailField(label='电子邮件')
    password1 = forms.CharField(max_length=30, label='密码', widget=forms.PasswordInput())
    password2 = forms.CharField(max_length=30, label='密码确认', widget=forms.PasswordInput())

    def clean(self):
        cleaned_data = super().clean()
        password1 = cleaned_data.get('password1')
        password2 = cleaned_data.get('password2')
        if password1 != password2:
            raise forms.ValidationError('两次密码不一致')

在视图文件中添加以下代码:

from django.shortcuts import render, redirect
from .forms import SignupForm

def signup(request):
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if form.is_valid():
            # 保存用户数据至数据库
            return redirect('home')
    else:
        form = SignupForm()
    return render(request, 'signup.html', {'form': form})

在模板文件中,则可以通过以下方式渲染表单:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">注册</button>
</form>
  1. 实现一个搜索表单

在 forms.py 文件中添加以下代码:

class SearchForm(forms.Form):
    search = forms.CharField(max_length=30, label='搜索')

在视图文件中添加以下代码:

from django.shortcuts import render
from .forms import SearchForm
from .models import Article

def search(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            search = form.cleaned_data.get('search')
            articles = Article.objects.filter(title__icontains=search)
            return render(request, 'search_results.html', {'articles': articles})
    else:
        form = SearchForm()
    return render(request, 'search.html', {'form': form})

在模板文件中,则可以通过以下方式渲染表单:

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

以上就是关于 Django 中表单的用法的完整攻略,希望能对你有所帮助。

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

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

相关文章

  • django+celery +rabbitmq

    celery是一个python的分布式任务队列框架,支持 分布的 机器/进程/线程的任务调度。采用典型的生产者-消费者模型 包含三部分:1. 队列 broker :可使用redis ,rabbitmq ,或关系数据库作为broker 2.处理任务的消费者workers : 队列中有任务时就发出通知,worker收到通知就去处理 3.任务结果存储 backen…

    Django 2023年4月13日
    00
  • Django1.5+Python3.3下groundwork的使用

    因为要学习“心内求法”关于Django的教程,其中提到了groundwork的应用,因为django1.5(应该说1.4及以上)目录结构生成较之前发生了变化,再加上python3.x的语法也较python2.7有所差异,所以为了使用groundwork,还需要做一些适应性的修改。记录如下,作为备忘: (1) 下载groundwork: 在https://gi…

    Django 2023年4月16日
    00
  • Django框架(二十八)—— Django缓存机制

    一、什么是缓存 动态网站中,用户请求都要去服务器的数据库中增删改查,会消耗很大的资源,因此,使用缓存在减轻服务器的压力。 缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。 二、Django的6中缓存方式及配置(只需要改…

    Django 2023年4月10日
    00
  • Python Django开发 1

    先配置个虚拟环境,在Flask第一篇文章有写,这里就跳过了 比如我的Django的目录是:C:\Workspaces\DjangoDemo,已经安装好了名为venv虚拟目录,接下来安装django框架,在虚拟环境状态下输入:pip install django即可 接下来创建一个Django项目的解决方案 虚拟环境下cd到C:\Workspaces\Djan…

    Django 2023年4月16日
    00
  • django2 + python3 显示静态文件中的图片

    之前一直搞不出来 是因为图片的问题,步骤也就是固定的几步,到位了就差不多成了文件夹结构:. ├── HelloWorld │   ├── __init__.py │   ├── __pycache__ │   │   ├── __init__.cpython-36.pyc │   │   ├── settings.cpython-36.pyc │   │  …

    Django 2023年4月12日
    00
  • Python的Django框架可适配的各种数据库介绍

    本文将详细讲解Python的Django框架可适配的各种数据库介绍,包括可适配的数据库类型、如何配置、常用API等。同时,本文还包含两条示例说明,以帮助开发者更好地了解Django框架与数据库交互的过程。 可适配的数据库类型 Django框架支持多种不同的数据库类型,包括: PostgreSQL MySQL SQLite Oracle Microsoft S…

    Django 2023年5月16日
    00
  • web之django的序列化器汇总

      django的rest_framework的一大特色是序列化器,其封装了视图中关于用户请求,验证及响应数据的处理部分,使得程序简洁化。此DRF框架中将数据模型对象转化为json、xml等可传输或存档的格式的过程称为序列化,反之称为反序列化。序列化器是专注于此类行为的类,有自定义序列化器,模型类序列化器,视图集合三类。 1.视图函数 2.类视图   1.自…

    Django 2023年4月12日
    00
  • python+Django CRM客户关系管理系统开发(一)–admin首页功能实现

    一、项目介绍 学习crm管理系统开发,将详细步骤记录在这里。 主要需求是,做一个培训机构的客户关系管理系统,通过后台能够管理学生,老师,销售 二、思路 做一个后台管理系统,仿照着Django的admin,做一个管理系统,好处是能够与项目结合,以后可以复制到其他项目中 初步分析,表结构如下: 这里就不放表了,自己随便写几个表就行 三、backadmin功能开发…

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