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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:48