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

无法向数据库插入数据,Django视图与模型代码排查求助

问题排查与解决

首先看你的代码,最核心的问题是表单验证通过后没有执行保存操作,导致数据根本没写入数据库。另外还有几个小细节需要调整,下面一步步拆解:

1. 缺失关键的表单保存步骤

在你的routineInput视图里,当form.is_valid()返回True时,你直接跳转了页面,但完全没调用form.save()来把表单数据持久化到数据库——这是数据没插入的最关键原因。

修改后的视图代码应该补上保存逻辑:

from datetime import datetime
from django.shortcuts import render, redirect
from .forms import CreateRoutine

def routineInput(request):
    if request.method == 'POST':
        form = CreateRoutine(request.POST)
        if form.is_valid():
            # 新增这行:将表单数据写入数据库
            form.save()
            return redirect('/todo/saved/')
    else:
        form = CreateRoutine()
    return render(request, 'todo/croutine.html', {'form': form})

2. 模型时间字段的优化建议

你的Todolist模型里,created_at和updated_at用了default=datetime.now,虽然语法上没问题(Django会把它当作可调用对象自动执行),但更符合Django最佳实践的写法是:

from django.db import models

class Todolist(models.Model):
    name = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True, blank=True)
    updated_at = models.DateTimeField(auto_now=True, blank=True)

这样created_at只会在创建记录时自动设置当前时间,updated_at每次修改记录时都会自动刷新成当前时间,不用手动处理时间逻辑。

3. 清理冗余代码

你在视图里定义了today = datetime.now,但这个变量完全没用到,而且这里还少了括号(正确写法是datetime.now()),建议直接删掉,保持代码整洁。

额外确认点

确保你的CreateRoutine表单是正确关联Todolist模型的ModelForm,比如:

from django import forms
from .models import Todolist

class CreateRoutine(forms.ModelForm):
    class Meta:
        model = Todolist
        fields = ['name']

如果你的表单是普通Form而非ModelForm,那需要手动创建模型实例并保存:

if form.is_valid():
    name = form.cleaned_data['name']
    Todolist.objects.create(name=name)
    return redirect('/todo/saved/')

按上面的步骤修改后,数据应该就能正常插入数据库了。

内容的提问来源于stack exchange,提问作者Helmut K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:33:04