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

Django表单数据无法保存至数据库,求助排查与解决方法

Django表单数据无法存入数据库问题排查与解决

问题描述

我是Django入门开发者,在PyCharm中开发时遇到表单数据无法保存至数据库的问题。核心问题是数据无法存入数据库,且无任何错误、警告提示,除数据保存功能外其他均正常运行。已尝试大量教程、文章及官方文档,但均未解决问题,恳请帮助!

相关代码

views.py

from django.shortcuts import render, redirect
from .models import Articles
from .forms import ArticlesForm


def news_home(request):
    news = Articles.objects.order_by('title')
    return render(request, 'news/news_home.html', {'news': news})


def create(request):
    error = ''
    if request.method == 'POST':
        form = ArticlesForm(request.POST)
        if form.is_valid():
            article = form.save()
            return redirect('news_home')
        else:
            error = '表单填写格式不正确。'

    form = ArticlesForm()

    data = {
        'form': form,
        'error': error
    }
    return render(request, 'news/create.html', data)

models.py

from django.db import models


class Articles(models.Model):
    title = models.CharField('标题', max_length=50)
    anons = models.CharField('摘要', max_length=250)
    full_text = models.TextField('正文')
    date = models.DateTimeField('发布日期')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '新闻'
        verbose_name_plural = '新闻'

forms.py

from .models import Articles
from django.forms import ModelForm, TextInput, DateTimeInput, Textarea


class ArticlesForm(ModelForm):
    class Meta:
        model = Articles
        fields = ['title', 'anons', 'full_text', 'date']

        widgets = {
            "title": TextInput(attrs={
                'class': 'form-control',
                'placeholder': '记录标题'
            }),
            "anons": TextInput(attrs={
                'class': 'form-control',
                'placeholder': '记录摘要'
            }),
            "full_text": Textarea(attrs={
                'class': 'form-control',
                'placeholder': '输入内容'
            }),
            "date": DateTimeInput(attrs={
                'class': 'form-control',
                'placeholder': '发布日期'
            }),
        }

create.html

{% extends 'main/layout.html' %}

{% block title%}创建文章{% endblock %}

{% block content%}
    <div class="features">
        <h1>创建文章</h1>
        <form action="{% url 'create' %}" method="POST" class="post-form">
            {% csrf_token %}
            {{ form.title }}<br>
            {{ form.anons }}<br>
            {{ form.full_text }}<br>
            {{ form.date }}<br>
            <span>{{ error }}</span>
            <button class="btn btn-success" type="submit">创建文章</button>
        </form>
    </div>
{% endblock %}

news_home.html

{% extends 'main/layout.html' %}

{% block title%}新闻列表{% endblock %}

{% block content%}
    <div class="features">
        <h1>新闻列表</h1>
        {% if news %}
            {% for el in news %}
                <div class="alert alert-warning">
                    <h3>{{ el.title }}</h3>
                    <p>{{ el.anons }}</p>
                    <p>{{ el.full_text }}</p>
                </div>
            {% endfor %}
        {% else %}
            <p>当前暂无任何记录</p>
        {% endif %}
    </div>
{% endblock %}

urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('main.urls')),
    path('news/', include('news.urls')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

排查与解决步骤

1. 修复日期字段格式问题

DateTimeInput组件默认未指定输入格式,前端输入的日期格式不符合Django预期时,会导致表单验证隐性失败,但不会触发自定义的error提示。修改forms.py中的日期组件,添加格式约束:

"date": DateTimeInput(attrs={
    'class': 'form-control',
    'placeholder': '发布日期(格式:YYYY-MM-DD HH:MM)'
}, format='%Y-%m-%d %H:%M')

2. 渲染表单详细错误信息

当前模板仅显示自定义的通用错误,无法看到具体字段的验证失败原因。修改create.html,为每个字段添加错误提示:

{% extends 'main/layout.html' %}

{% block title%}创建文章{% endblock %}

{% block content%}
    <div class="features">
        <h1>创建文章</h1>
        <form action="{% url 'create' %}" method="POST" class="post-form">
            {% csrf_token %}
            {{ form.title }}<br>
            {% if form.title.errors %}
                <span class="text-danger">{{ form.title.errors.0 }}</span><br>
            {% endif %}
            {{ form.anons }}<br>
            {% if form.anons.errors %}
                <span class="text-danger">{{ form.anons.errors.0 }}</span><br>
            {% endif %}
            {{ form.full_text }}<br>
            {% if form.full_text.errors %}
                <span class="text-danger">{{ form.full_text.errors.0 }}</span><br>
            {% endif %}
            {{ form.date }}<br>
            {% if form.date.errors %}
                <span class="text-danger">{{ form.date.errors.0 }}</span><br>
            {% endif %}
            <span>{{ error }}</span>
            <button class="btn btn-success" type="submit">创建文章</button>
        </form>
    </div>
{% endblock %}

3. 检查并执行数据库迁移

确保模型变更已同步到数据库:

python manage.py makemigrations
python manage.py migrate

4. 添加调试日志(可选)

在views.py的create函数中添加调试代码,确认表单数据是否正常获取及保存:

def create(request):
    error = ''
    if request.method == 'POST':
        form = ArticlesForm(request.POST)
        # 打印表单提交的数据
        print("POST数据:", request.POST)
        if form.is_valid():
            # 打印验证后的干净数据
            print("验证通过的数据:", form.cleaned_data)
            article = form.save()
            # 打印保存后的文章ID,确认是否写入数据库
            print("保存的文章ID:", article.id)
            return redirect('news_home')
        else:
            # 打印所有表单错误
            print("表单错误:", form.errors)
            error = '表单填写格式不正确。'

    form = ArticlesForm()

    data = {
        'form': form,
        'error': error
    }
    return render(request, 'news/create.html', data)

执行以上步骤后,应该能定位到数据无法保存的具体原因并解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:35:54