Django中无法保存表单数据至数据库,需实现表单增查功能
Django表单数据存库失败?看这里一步步解决!
最近搞Django开发时踩了个坑:用表单提交的内容死活存不到数据库里,本来想实现「添加内容+页面展示」的功能,结果卡在存数据这一步了。先把我目前的代码贴出来,大伙帮忙瞅瞅问题出在哪?
现有代码配置
博客项目URL配置(根urls.py)
urlpatterns = [ url(r'^admin/',admin.site.urls), url(r'^blog/',include('content.urls',)), ]
content应用URL配置(content/urls.py)
urlpatterns = [ url(r'^add/$', views.add_content, name='content'), ]
models.py(content/models.py)
from django.db import models class AddContent(models.Model): content_name = models.CharField(max_length=100, default='', blank=False, unique=True) def __str__(self): return self.content_name
forms.py(content/forms.py,代码未写完)
from django import forms from .models im...
问题排查与修复方案
我猜大概率是表单定义不完整或者视图逻辑没处理好POST请求,这俩是新手常踩的坑,咱们一步步来:
1. 补全forms.py的代码
首先得把表单类写完,推荐用ModelForm,它能直接和模型绑定,省不少事:
from django import forms from .models import AddContent # 补全导入 class ContentForm(forms.ModelForm): class Meta: model = AddContent # 指定关联的模型 fields = ['content_name'] # 指定要生成表单字段的模型字段
2. 修复视图函数(views.add_content)
这是核心!必须正确处理GET(展示表单)和POST(提交数据)两种请求:
from django.shortcuts import render, redirect from .forms import ContentForm from .models import AddContent def add_content(request): # 处理POST请求:提交表单 if request.method == 'POST': # 用POST数据实例化表单 form = ContentForm(request.POST) # 验证表单数据是否合法 if form.is_valid(): # 保存数据到数据库!这步千万不能忘 form.save() # 保存后重定向,避免重复提交(可选,但推荐) return redirect('content') # 处理GET请求:展示空表单 else: form = ContentForm() # 查询所有已保存的内容,用于在模板展示 contents = AddContent.objects.all() # 把表单和数据传给模板 return render(request, 'content/add_content.html', {'form': form, 'contents': contents})
3. 完善模板文件(比如content/templates/content/add_content.html)
要正确渲染表单、处理CSRF、展示错误信息和已保存的数据:
<form method="post"> {% csrf_token %} <!-- Django必须的CSRF防护,不能丢! --> <!-- 渲染表单字段,as_p是简单的换行展示方式 --> {{ form.as_p }} <!-- 显示表单错误信息(比如重复的content_name) --> {% if form.errors %} <div style="color: red;"> {% for field in form %} {{ field.errors }} {% endfor %} </div> {% endif %} <button type="submit">添加内容</button> </form> <!-- 展示已保存的内容 --> <h3>已添加的内容列表</h3> <ul> {% for content in contents %} <li>{{ content.content_name }}</li> {% empty %} <li>还没有添加任何内容哦</li> {% endfor %} </ul>
4. 额外注意点
- 模型里
content_name设置了unique=True,如果提交重复的名称,表单验证会失败,一定要在模板里显示错误信息,不然用户不知道为啥提交失败 - 确保已经执行过数据库迁移:
python manage.py makemigrations和python manage.py migrate,不然模型的表根本没创建,数据肯定存不进去
这样一套操作下来,表单数据应该能正常存到数据库,而且页面也能展示出来啦!
内容的提问来源于stack exchange,提问作者Akshay
相关产品推荐
相关产品推荐

