You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django函数视图中保存ModelForm提交的数据?

解决Django函数视图+ModelForm表单数据不保存的问题

嘿,我一眼就找到问题的根源了:你的表单提交的目标URL不对,导致POST请求根本没被处理保存逻辑的视图接收,自然数据存不进数据库里。

核心问题分析

看你的create_person.html里的表单代码:

<form action="/person/persons-list/" method="post">{% csrf_token %}

你把表单提交到了列表页的URL,而列表页对应的persons_list_view只处理GET请求(用来展示数据),完全没有处理POST表单的逻辑。所以点击提交后,页面跳转到列表页,但表单数据根本没被传到create_person_view里执行保存操作,数据库自然不会新增数据。

解决方案(保留函数视图+ModelForm)

1. 修正表单的提交地址

最简单的方式是让表单提交到当前页面(也就是create_person_view对应的URL),把action属性留空即可:

{% extends 'base.html' %}
{% block content %}
<div class="jumbotron jumbotron-fluid mt-4 ">
    <div class="container">
        <h1 align="center">Create Person</h1>
        <div class="container mt-3 mb-3">
            <div class="mt-5 ml-5">
                <form action="" method="post">{% csrf_token %}
                    {{ form.as_p }}
                    <input type="submit" value="Create Person">
                </form>
            </div>
        </div>
    </div>
</div>
{% endblock %}

更健壮的做法:使用Django的URL反向解析(推荐),先确保你在urls.py里给视图设置了名称:

# urls.py示例
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home_view, name='home'),
    path('person/persons-list/', views.persons_list_view, name='persons-list'),
    path('person/create/', views.create_person_view, name='create-person'),
]

然后把表单的action改成反向解析的URL:

<form action="{% url 'create-person' %}" method="post">{% csrf_token %}

2. (可选优化)优化保存后的跳转逻辑

当前视图保存数据后返回HttpResponse('Working!'),用户体验不太好,可以改成跳转到列表页,让用户直接看到新增的数据:
首先在views.py里导入redirect:

from django.shortcuts import render, redirect

然后修改保存后的返回语句:

def create_person_view(request):
    if request.method == 'POST':
        form = CreatePersonForm(request.POST)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.save()
            return redirect('persons-list')  # 跳转到列表页
    else:
        form = CreatePersonForm()
    context = {'form': form}
    return render(request, 'create_person.html', context)

验证效果

现在重新提交表单,数据会被正确传到create_person_view处理,保存后跳转到列表页,你就能看到新增的Person数据啦~

内容的提问来源于stack exchange,提问作者Techoplite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:07:31