Django ModelForm 实现数据增删改查完整指南

阿麦
阿麦
发布时间:2026-10-12| 1人浏览过
原创

Django 的 ModelForm 是连接数据库模型与前端表单的高效组件,它允许开发者将数据库模型直接转化为表单字段,并自动处理数据的验证与保存。本文将通过一个书籍管理的完整案例,详细解析如何定义 ModelForm 类、配置字段属性,并编写视图函数来实现数据的添加与编辑功能。

ModelForm 核心概念与定义

ModelForm 的主要优势在于它能自动将 Django 模型(Model)中的字段映射到表单字段。开发者只需指定模型和需要展示的字段,即可生成对应的表单组件。以下代码展示了如何定义一个名为 Test 的 ModelForm 类,将其绑定到 models.Article 模型,并选择展示所有字段:

from django.forms import ModelForm

class Test(ModelForm):
    class Meta:
        # 绑定对应的数据库模型
        model = models.Article
        # 展示所有字段,也可指定特定字段列表
        fields = "__all__"

数据保存与更新机制

ModelForm 提供了 save() 方法,该方法能够根据表单数据自动创建或更新数据库记录,无需手动处理字段映射。无论是单表、一对多还是多对多关系,save() 都能正确处理关联数据。

添加数据

在添加新数据时,只需实例化 ModelForm 并传入 POST 请求数据,验证通过后调用 save() 即可:

# 假设 form 已通过 is_valid() 验证
form.save()

编辑数据

编辑操作的关键在于实例化表单时传入 instance 参数,指定要更新的具体数据库对象。这样,表单会预填充该对象的现有值,保存时则更新该对象:

# 获取要编辑的对象
obj = models.Article.objects.all().first()
# 实例化表单并传入实例
form = Test(instance=obj)
# 处理 POST 请求并保存
form = Test(request.POST, instance=obj)
if form.is_valid():
    form.save()

视图函数实战:列表展示

在展示书籍列表时,我们需要从数据库中获取所有书籍对象,并提取关键字段(如 ID、标题、出版社、作者)构建列表数据。以下 test_models 视图函数展示了如何获取数据并渲染到模板:

def test_models(request):
    method = request.method.lower()
    if method == "get":
        body_list = []
        obj = models.Book.objects.all()
        # 获取模型字段元数据
        head_list = models.Book._meta.get_fields()
        
        for i in obj:
            temp = []
            temp.append(i.bid)
            temp.append(i.title)
            temp.append(i.publish)
            # 获取关联的作者列表
            temp.append(i.auther.all())
            body_list.append(temp)
        return render(request, "modelform_html1.html", locals())
    else:
        pass

ModelForm 的高级配置

除了基本映射,ModelForm 允许开发者自定义标签、错误信息和 Widget 组件,以优化用户体验。以下代码展示了如何配置 test 类:

class test(ModelForm):
    class Meta:
        model = models.Book
        fields = "__all__"
        # 自定义字段标签
        labels = {
            "title": "书籍的名称",
            "auther": "作者",
            "publish": "出版社"
        }
        # 自定义错误信息
        error_messages = {
            "title": {
                "required": "不允许为空",
                "invalid": "格式错误"
            }
        }
        # 自定义 Widget 及属性
        widgets = {
            "title": wd.TextInput(attrs={"placeholder": "密码"})
        }
        # 指定字段类
        field_classes = {
            "title": forms.EmailField
        }

添加与编辑视图实现

以下两个视图函数分别处理书籍的添加和编辑操作,展示了 ModelForm 在完整业务流程中的应用。

添加书籍

在 add 视图中,GET 请求时实例化空的 ModelForm 用于展示表单;POST 请求时,传入请求数据并验证。若验证通过,调用 save() 保存数据并重定向到列表页;若失败,则重新渲染表单并显示错误信息:

def add(request):
    method = request.method.lower()
    if method == "get":
        model_form_obj = test()
        # 可在此处打印标签用于调试
        for i in model_form_obj:
            print(i.label_tag(), "----------------------")
        return render(request, "modelfrom_add.html", locals())
    else:
        model_form_obj = test(request.POST)
        if model_form_obj.is_valid():
            model_form_obj.save()
            return redirect("/app2/test_models/")
        else:
            print("出错了")
            model_form_obj = test(request.POST)
            return render(request, "modelfrom_add.html", locals())

编辑书籍

edit 视图首先通过 URL 参数获取要编辑的书籍对象。在 GET 请求时,将对象作为 instance 传入 ModelForm 以预填充数据;在 POST 请求时,同样传入实例并保存更新:

def edit(request):
    method = request.method.lower()
    # 获取要编辑的书籍对象
    book_obj = models.Book.objects.get(bid=int(request.GET.get("id")))
    
    if method == "get":
        # 预填充表单数据
        model_form_obj = test(instance=book_obj)
        return render(request, "modelfrom_add.html", locals())
    else:
        # 处理更新请求
        model_form_obj = test(request.POST, instance=book_obj)
        model_form_obj.save()
        return redirect("/app2/test_models/")

以上就是 Django ModelForm 实现数据增删改查的详细内容,更多关于 Django 表单处理与 Web 开发技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。