如何在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
相关产品推荐
相关产品推荐

