Django中modelform组件实例用法总结

Django中modelform组件实例用法总结

什么是ModelForm

Django中的ModelForm是一个用于创建表单的工具,它可以快速方便地生成表单,并且能够自动地处理表单数据的校验和处理,相较于手写表单处理的方法,使用ModelForm可以减轻开发量和提高开发效率。

ModelForm可以从一个Database Model自动生成简单的表单,而不需要开发人员手动定义表单字段等元素,其生成的表单也默认包含了Model中定义的所有字段信息。另外,ModelForm还会为这些字段自动创建前端HTML控件,并根据Model中定义的校验条件和参数,自动生成相应的JavaScript校验函数等细节操作,简化了开发人员对于表单的处理和校验等工作。

ModelForm的用法

ModelForm的用法非常简单,只需要首先定义一个表单Model,然后使用ModelForm来派生出一个表单类,在视图函数中实例化该表单类即可。

定义Model

定义Model的过程与Django中定义一般的Model相同,需要定义表的字段,数据类型、是否为空、默认值、max_length等等。

from django.db import models

class Book(models.Model):
    title = models.CharField('书名',max_length=50)
    author = models.CharField('作者',max_length=50)
    publisher = models.CharField('出版社',max_length=50)
    pub_date = models.DateField('出版日期')

定义ModelForm

定义ModelForm的过程需要引入以下的模块:

from django import forms
from .models import Book

接着,基于上面所定义的Book模型,我们可以定义一个对应的ModelForm表单类,如下所示:

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ('title', 'author', 'publisher', 'pub_date')

在上述代码中,首先需要导入forms和Book模型类,然后实例化一个ModelForm,将它的model属性指向Book,将它的fields属性设置为列表形式的包含4个字段的元素。这就是定义表单的过程,通过一个ModelForm对象,就能够获得一个与Model对应的表单。这里我们定义一个BookForm类来表示这个表单。

在视图函数中调用ModelForm

在视图函数中调用ModelForm也非常简单,只需要将定义好的Form类实例化即可:

from django.shortcuts import render
from .models import Book
from .forms import BookForm

def book_form(request):
    if request.method == 'POST':
        form = BookForm(request.POST)
        if form.is_valid():
            book = form.save()
            return redirect('book_detail', pk=book.pk)
    else:
        form = BookForm()
    return render(request, 'book/form.html', {'form': form})

在上述代码中,如果接收到的请求是POST方式,实例化BookForm表单,并验证表单是否有效,如果验证通过就将表单数据写入数据库,并重定向到主页,否则保留并返回表单以供修改。

示例说明

这里我将提供两种常见的使用场景进行说明:

使用ModelForm添加数据

# 在视图函数中添加如下代码
def add(request):
    if request.method == 'GET':
        form = BookForm()
        return render(request, 'add.html', {'form': form})
    elif request.method == 'POST':
        form = BookForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('book_list')
        else:
            return render(request, 'add.html', {'form': form})

在GET请求下,我们通过BookForm实例化一个表单对象并返回到template中。在POST请求下,我们通过BookForm(request.POST)实例化一个表单对象并从request中取出表单数据,接着判断表单是否合法,如果合法则保存表单数据并重定向到之前设置的book_list中,否则重新渲染这个页面以便用户修改并重新提交数据。

使用ModelForm更新数据

# 在视图函数中添加如下代码
def update(request, pk):
    book = get_object_or_404(Book, pk=pk)
    if request.method == 'GET':
        form = BookForm(instance=book)
        return render(request, 'update.html', {'form': form})
    elif request.method == 'POST':
        form = BookForm(request.POST, instance=book)
        if form.is_valid():
            form.save()
            return redirect('book_list')
        else:
            return render(request, 'update.html', {'form': form})

在这个模板中,我们与之前的表单处理过程类似,在GET请求下,我们首先获取到对应的book对象,并将其传入BookForm中,再将表单返回到template中以便于用户修改表单数据。在POST请求下,我们也是将这个book对象传入BookForm中,然后从request中取出表单数据,接着判断表单数据是否合法,如果合法则对book对象进行更新,最后重新定向到之前设置的book_list中,否则重新渲染这个页面以便于用户修改并重新提交数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django中modelform组件实例用法总结 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 微信公众号开发者账号该怎么申请?

    要申请微信公众号开发者账号,步骤如下: 1. 进入微信公众平台官网 在浏览器中输入 https://mp.weixin.qq.com 并进入微信公众平台官网。 2. 注册微信公众号开发者账号 在微信公众平台官网首页,点击“注册”,进入注册页面。填写邮箱、手机号等相关信息并进行人机验证,最后点击“注册”。 3. 登录微信公众号开发者账号 注册完成后,使用已注册…

    other 2023年6月26日
    00
  • EXCEL坐标轴怎么自定义设置?

    EXCEL中的坐标轴可以自定义设置,包括调整坐标轴刻度、坐标轴标签、坐标轴位置等。下面,我们将提供详细的攻略指导。 一、自定义设置坐标轴 1.1 调整坐标轴刻度 首先,右键单击图表中的坐标轴,选择格式化坐标轴选项。在弹出的格式化轴选项中,可以调整刻度尺寸、主刻度和次刻度之间的间距等。 示例1:调整坐标轴主刻度和次刻度之间的间距 在图表中选择一个坐标轴,右键单…

    other 2023年6月25日
    00
  • win10恢复win7无限重启怎么解决?

    下面是详细的“Win10恢复Win7无限重启怎么解决?”攻略: 问题描述 当用户将Windows 7 PC升级到Windows 10时,可能会出现无限重启的问题。 在这种情况下,用户可能面临无法使用PC的局面,因为PC会在启动过程中无限重启。 解决这个问题可以通过以下步骤来完成: 步骤一:进入安全模式 用户需要进入安全模式并禁用自动重启设置。 此时,PC将在…

    other 2023年6月26日
    00
  • Java实现双端链表LinkedList

    Java实现双端链表LinkedList的完整攻略 双端链表LinkedList介绍 双端链表LinkedList是链表的一种,除了拥有节点指向下一个节点的指针外,还拥有指向上一个节点的指针,这样可以双向遍历链表。常用的操作包括插入、删除、获取和遍历。 实现步骤 1. 定义节点类 节点类用来表示链表的一个节点,包含节点的值(value)、下一个节点(next…

    other 2023年6月27日
    00
  • Windows WMIC命令使用详解(附实例)

    Windows WMIC命令使用详解(附实例) 一、WMIC命令是什么? WMIC 全称是 Windows Management Instrumentation Command,是一个命令行工具,用于控制本地或远程计算机的系统管理资源(如进程、服务、事件日志等)。可以获取、查询、配置和管理各种资源。 二、WMIC命令的使用方法 1. WMIC命令的基本语法 …

    other 2023年6月26日
    00
  • 浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解

    浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解 MySQL中的授权(grant)和撤销授权(revoke)是用于管理用户权限的重要命令。授权允许用户执行特定的操作,而撤销授权则取消了用户的权限。本文将详细介绍这两个命令的用法,并提供两个示例说明。 授权(grant)命令用法 授权命令用于给用户赋予特定的权限。其基本语法如下: GRANT…

    other 2023年7月27日
    00
  • 服务器远程超出最大连接数常用解决办法

    服务器远程超出最大连接数是常见的问题,其会使得服务器不稳定甚至直接导致崩溃。这是因为服务器同时处理的连接数超出了系统限制,从而导致无法处理新的请求。本文将介绍如何解决这个问题。 问题分析 在解决服务器远程超出最大连接数的问题之前,我们需要先分析服务器出现这个问题的原因。这个问题通常是由于以下原因导致的:1. 服务器的资源不足,导致无法处理更多连接。2. 服务…

    other 2023年6月27日
    00
  • 微信小程序实现简易计算器

    result: ‘0’, operator: ”, operand1: ”, operand2: ” }, onLoad: function () { this.setData({ result: ‘0’, operator: ”, operand1: ”, operand2: ” }); }, handleNumberClick: functi…

    other 2023年8月6日
    00
合作推广
合作推广
分享本页
返回顶部