Django Form and ModelForm的区别与使用

Django是一款常用的Web开发框架,它提供了丰富的功能和组件来帮助开发者创建高效的Web应用程序。其中,Form和ModelForm是Django中非常重要的两个组件,用于处理表单数据和数据模型。本文将深入探讨Django Form和ModelForm的区别和使用。

1. Form和ModelForm的区别

在Django中,Form和ModelForm都是用于处理表单数据的组件。Form是一个基本的表单,它通过定义表单字段,验证表单数据并转换成Python对象。而ModelForm则是对Form进行了进一步的封装,它可以自动处理模型对象和表单对象之间的映射关系,从而能够快速地创建和修改模型对象的数据。

具体来说,Form和ModelForm的主要区别如下:

  1. 数据源不同:

Form可以从任何数据源中获取数据,比如request.POST或request.GET,而ModelForm则必须以一个模型对象作为其数据源。这意味着,使用ModelForm时必须要从数据库中读取模型对象,才能够自动生成表单对象。

  1. 保存数据的方式不同:

Form无法直接保存数据到数据库中,而是需要手动将表单数据转换成模型对象并保存到数据库中。而ModelForm则可以自动将表单数据保存到其对应的模型中,省去了手动处理的步骤。

  1. 表单字段不同:

Form中的字段是直接定义的,而ModelForm中的字段则是从模型中自动获取的。这意味着,使用ModelForm时无需手动定义表单字段,也无需手动添加验证规则,这些都会自动继承模型的属性。

2. 使用Form和ModelForm

Django提供了丰富的表单组件以支持用户输入和提交数据。下面我们将介绍如何使用Form和ModelForm创建表单对象,以及如何在模板中使用表单对象。

2.1 使用Form

使用Form时,需要首先定义表单类,例如:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField()
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)

以上代码定义了一个名为ContactForm的表单,它包括三个字段:name、email和message。其中,name和email都是基本的CharField和EmailField字段,而message使用了Textarea小部件以提供多行输入。

在视图函数中,可以通过以下步骤实例化表单对象、验证表单数据并进行相应处理:

from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            name = form.cleaned_data['name']
            email = form.cleaned_data['email']
            message = form.cleaned_data['message']
            # 转向成功页面
            return HttpResponseRedirect('/success/')
    else:
        form = ContactForm()
    return render(request, 'contact.html', {'form': form})

以上代码中,首先判断请求的方法是否为POST,如果是则实例化表单对象,并调用is_valid()方法验证表单数据是否合法。如果表单数据验证通过,则从表单对象的cleaned_data属性中获取处理后的数据,并进行相应的处理。如果表单数据验证失败,则返回原表单并给出错误提示。如果请求的方法为GET,则直接返回空的表单对象以供用户填写。

在模板中,可以通过以下代码引用表单对象并渲染表单:

<form method="post" action="">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

以上代码中,使用了form.as_p渲染表单对象,并添加了一个CSRF令牌,以防御跨站点伪造请求攻击(CSRF)。

2.2 使用ModelForm

与使用Form类似,使用ModelForm也需要先定义一个模型表单类,例如:

from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'content', 'is_public']
        widgets = {
            'content': forms.Textarea(attrs={'cols': 80, 'rows': 10}),
        }

以上代码定义了一个名为ArticleForm的ModelForm,它继承了Django提供的ModelForm类,并指定了模型类Article作为它的数据源。在Meta类中,可以设置fields属性以指定表单字段,widgets属性以定制表单小部件。

在视图函数中,可以通过以下步骤实例化模型表单对象、验证表单数据并进行相应处理:

from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import ArticleForm

def create_article(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            article = form.save(commit=False)
            article.author = request.user
            article.save()
            # 转向成功页面
            return HttpResponseRedirect('/success/')
    else:
        form = ArticleForm()
    return render(request, 'article_create.html', {'form': form})

以上代码中,首先判断请求的方法是否为POST,如果是则实例化模型表单对象,并调用is_valid()方法验证表单数据是否合法。如果表单数据验证通过,则从表单对象的cleaned_data属性中获取处理后的数据,并使用form.save()方法将表单数据保存到相应的模型中。在这个例子中,我们还添加了一个作者(即request.user)来创建文章。如果表单数据验证失败,则返回原表单并给出错误提示。

在模板中,可以使用与使用Form类似的方式引用模型表单对象:

<form method="post" action="">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

以上代码中,使用了form.as_p渲染模型表单对象,并添加了一个CSRF令牌。

3. 示例说明

接下来,我们以一个简单的应用程序为例来说明如何使用Form和ModelForm创建和处理表单数据。

假设我们有一个名为blog的Django应用程序,它包含一个文章模型Article,该模型包括标题、正文、日期等属性。我们希望添加两个表单页面:一个用于创建新文章,另一个用于搜索文章。

3.1 创建新文章

为了创建新文章,我们首先需要创建一个ArticleForm模型表单类:

# blog/forms.py
from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'content', 'pub_date']
        labels = {
            'title': '标题',
            'content': '正文',
            'pub_date': '发布日期',
        }
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'content': forms.Textarea(attrs={'class': 'form-control'}),
            'pub_date': forms.DateInput(attrs={'class': 'form-control'}),
        }

以上代码中,我们定义了一个ArticleForm类,并指定了Article类作为数据源。我们同时设置了该表单的字段,标签和小部件,以提高表单的表现力和用户交互性。

然后,我们在视图函数中使用该表单类处理表单数据:

# blog/views.py
from django.shortcuts import render, redirect
from .models import Article
from .forms import ArticleForm

def create_article(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('blog:index')
    else:
        form = ArticleForm()
    return render(request, 'blog/new_article.html', {'form': form})

以上代码中,我们定义了create_article视图函数,其使用ArticleForm类来处理表单数据。如果表单数据验证通过,则使用form.save()方法将文章保存到数据库中,并重定向到博客主页。

最后,我们使用模板渲染该表单:

<!-- blog/templates/blog/new_article.html -->
{% extends "base.html" %}

{% block title %}创建新文章{% endblock %}

{% block content %}
    <h1>创建新文章</h1>
    <form method="post" action="{% url 'blog:create_article' %}">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="btn btn-primary">提交</button>
    </form>
{% endblock %}

以上代码中,我们使用了form.as_p渲染表单对象,并添加了一个按钮以提交表单数据。该表单使用了Bootstrap框架样式来提高用户体验。

3.2 搜索文章

为了搜索文章,我们可以使用一个普通的表单和一个查询函数来实现:

# blog/views.py
def search_articles(request):
    query = request.GET.get('q')
    results = Article.objects.filter(title__icontains=query)
    return render(request, 'blog/search_results.html', {'results': results, 'query': query})

# blog/templates/blog/search.html
{% extends "base.html" %}

{% block title %}搜索文章{% endblock %}

{% block content %}
    <h1>搜索文章</h1>
    <form method="get">
        <div class="form-group">
            <label for="q">搜索标题</label>
            <input type="text" name="q" class="form-control" value="{{ query }}">
        </div>
        <button type="submit" class="btn btn-primary">搜索</button>
    </form>
{% endblock %}

{% block results %}
    {% if results %}
        <h2>搜索结果</h2>
        <ul>
            {% for article in results %}
                <li><a href="{{ article.get_absolute_url }}">{{ article.title }}</a></li>
            {% endfor %}
        </ul>
    {% else %}
        <p>没有符合条件的文章。</p>
    {% endif %}
{% endblock %}

以上代码中,我们定义了search_articles视图函数以处理表单数据。该视图函数使用简单的filter查询来查找所有匹配的文章,并将其传递给search_results模板,以便用于渲染相应的搜索结果。

最后,我们使用search.html模板来渲染搜索表单,以及使用search_results.html模板来渲染搜索结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django Form and ModelForm的区别与使用 - Python技术站

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

相关文章

  • 用Python做一个简单的图书管理系统

    下面是使用Python实现一个简单的图书管理系统的攻略: 1. 确定需求和功能 在着手实现图书管理系统之前,我们需要先明确需要实现的功能,例如图书的添加、删除、修改和查询,借阅、归还等。具体的需求可以根据实际情况进一步补充。 2. 构建数据库 构建数据库是实现图书管理系统的关键步骤之一。在Python中,可以使用SQLite或者其他第三方数据库模块(如MyS…

    人工智能概览 2023年5月25日
    00
  • Django Admin设置应用程序及模型顺序方法详解

    下面我将为您详细讲解“Django Admin设置应用程序及模型顺序方法详解”。 1. 什么是Django Admin Django Admin 是 Django 框架内置的后台管理系统,可以方便地创建、编辑、删除应用程序及模型,管理网站的日常运维工作。 2. 设置应用程序及模型顺序方法 Django Admin 默认按应用程序的字母顺序排列,但是我们希望能…

    人工智能概览 2023年5月25日
    00
  • python使用socket实现图像传输功能

    我会详细讲解“python使用socket实现图像传输功能”的完整攻略,下面是具体的步骤: 1. 创建服务器端代码 首先,在服务器端代码中需要完成以下操作: 1.1. 导入socket库 import socket 1.2. 创建socket对象 server_socket = socket.socket() 1.3. 绑定ip地址和端口号 server_s…

    人工智能概览 2023年5月25日
    00
  • SpringBoot使用OpenCV示例总结

    SpringBoot使用OpenCV示例总结 简介 OpenCV是一个开源的计算机视觉库,可以用于图像处理、机器视觉和模式识别等领域。SpringBoot是一个基于Spring框架的快速开发微服务的框架。本示例将演示如何在SpringBoot中使用OpenCV库。 准备工作 在开始前,需要安装以下软件: JDK 1.8及以上版本 Maven OpenCV 4…

    人工智能概览 2023年5月25日
    00
  • 使用C#连接并读取MongoDB数据库

    连接并读取MongoDB数据库可以通过MongoDB C#驱动程序来实现,以下是详细的攻略: 1.安装MongoDB数据库 MongoDB数据库可以在官网上下载安装,安装完成后需要启动MongoDB服务。 2.安装MongoDB C#驱动程序 可以通过NuGet包管理器来安装MongoDB C#驱动程序,安装完成后可以在项目引用中看到MongoDB相关的引用…

    人工智能概论 2023年5月25日
    00
  • 结构体类型数据作为函数参数(三种方法)

    结构体是C语言中一个非常有用的数据类型。如果使用得当,它可以大大简化代码的编写和管理。在C语言中,我们可以通过三种不同的方法将结构体类型数据作为函数参数传递给函数。 方法一:传递结构体变量的地址 方法一是将结构体变量的地址作为函数参数传递。这是最常见的做法,因为它既简单又直观。下面是示例代码: #include <stdio.h> struct …

    人工智能概览 2023年5月25日
    00
  • pycharm查看变量值的4种方法汇总

    下面就是PyCharm查看变量值的4种方法汇总的完整攻略: 1. 使用Debug模式 Debug模式可以在我们的代码执行过程中实时查看变量的值。具体步骤如下: 在PyCharm中打开我们的Python代码文件; 在代码行数的左侧打上断点,即点击想要打断点的行的行号区域; 点击“Debug”按钮(可以使用快捷键Shift+F9),运行程序; 当程序执行到断点处…

    人工智能概览 2023年5月25日
    00
  • Django中外键使用总结

    那么我会针对“Django中外键使用总结”进行一个完整的攻略。 什么是外键? 在数据库中,一个表可能会有外键(foreign key),外键通常被用作表之间的关联。外键就是用来关联两张表的字段,关联关系的建立可以在数据库层面来实现,也可以在业务逻辑层面实现。 Django中的外键 在Django中,外键是一个非常重要的概念,它用于建立模型类之间的关联。在Dj…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部