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

Django+Postgres项目:浏览器提交表单无法创建新条目求助

问题分析与解决方案

核心问题

你的表单提交逻辑完全错误:HTML表单的action直接指向了entry_success页面,并且传递了页面加载时的旧条目ID。这导致提交表单时,根本没有经过entry_form视图的POST处理流程,自然不会创建新条目,反而直接用旧ID查询了已存在的条目。

修复步骤

1. 修正HTML表单的提交目标

把表单的action改成指向entry_form视图,删除多余的隐藏字段latest_entry_id:

<!DOCTYPE html>
<html>
<head>
    <title>Journal Entry Form</title>
    <style>
        .form-group {
            margin-bottom: 10px;
        }

        .form-group label {
            display: block;
        }

        .form-group .field-wrapper {
            display: flex;
            align-items: center;
        }

        .form-group .help-text {
            margin-left: 10px;
            font-size: 12px;
            color: #999;
        }
    </style>
</head>
<body>
    <h1>Journal Entry Form</h1>
    <!-- 修改action为entry_form,或留空默认提交到当前页面 -->
    <form method="post" action="{% url 'journal:entry_form' %}">
        {% csrf_token %}
        <div class="form-group">
            <label for="{{ form.mood.id_for_label }}">{{ form.mood.label }}</label>
            {{ form.mood }}
            <span class="help-text">{{ form.mood.help_text }}</span>
        </div>
        <div class="form-group">
            <label for="{{ form.sleep_duration.id_for_label }}">{{ form.sleep_duration.label }}</label>
            {{ form.sleep_duration }}
            <span class="help-text">{{ form.sleep_duration.help_text }}</span>
        </div>
        <div class="form-group">
            <label for="{{ form.sleep_quality.id_for_label }}">{{ form.sleep_quality.label }}</label>
            {{ form.sleep_quality }}
            <span class="help-text">{{ form.sleep_quality.help_text }}</span>
        </div>
        <div class="form-group">
            <label for="{{ form.heart_rate_min.id_for_label }}">{{ form.heart_rate_min.label }}</label>
            {{ form.heart_rate_min }}
            <span class="help-text">{{ form.heart_rate_min.help_text }}</span>
        </div>
        <div class="form-group">
            <label for="{{ form.heart_rate_max.id_for_label }}">{{ form.heart_rate_max.label }}</label>
            {{ form.heart_rate_max }}
            <span class="help-text">{{ form.heart_rate_max.help_text }}</span>
        </div>
        <div class="form-group">
            <label for="{{ form.exercise_duration.id_for_label }}">{{ form.exercise_duration.label }}</label>
            {{ form.exercise_duration }}
            <span class="help-text">{{ form.exercise_duration.help_text }}</span>
        </div>
        <div class="form-group">
            <label for="{{ form.screen_time_hours.id_for_label }}">{{ form.screen_time_hours.label }}</label>
            {{ form.screen_time_hours }}
        </div>
        <div class="form-group">
            <label for="{{ form.screen_time_minutes.id_for_label }}">{{ form.screen_time_minutes.label }}</label>
            {{ form.screen_time_minutes }}
        </div>
        <div class="form-group">
            <label for="{{ form.energy.id_for_label }}">{{ form.energy.label }}</label>
            {{ form.energy }}
            <span class="help-text">{{ form.energy.help_text }}</span>
        </div>
        <div class="form-group">
            <label for="{{ form.notes.id_for_label }}">{{ form.notes.label }}</label>
            {{ form.notes }}
            <span class="help-text">{{ form.notes.help_text }}</span>
        </div>
        <button type="submit">Submit</button>
    </form>    
</body>
</html>

2. 修正视图的空数据库异常

entry_form视图一开始查询最新条目时,若数据库为空会抛出异常,需要添加判断:

from django.shortcuts import render, redirect
from .models import Entry
from .forms import EntryForm
from django.urls import reverse

def entry_form(request):
    latest_entry_id = None
    # 处理数据库为空的情况
    if Entry.objects.exists():
        latest_entry = Entry.objects.latest('id')
        latest_entry_id = latest_entry.id

    if request.method == 'POST':
        form = EntryForm(request.POST)
        if form.is_valid():
            entry = form.save()  # 创建新条目
            return redirect(reverse('journal:entry_success', kwargs={'latest_entry_id': entry.id}))
        else:
            print('Form errors:', form.errors)
    else:
        form = EntryForm()
    
    return render(request, 'journal/entry_form.html', {'form': form, 'latest_entry_id': latest_entry_id})

def entry_list(request):
    entries = Entry.objects.all()
    return render(request, 'journal/entry_list.html', {'entries': entries})

def entry_success(request, latest_entry_id):
    print('Entry success view called')
    try:
        latest_entry = Entry.objects.get(id=latest_entry_id)
        print('Latest Entry ID:', latest_entry.id)
    except Entry.DoesNotExist:
        print('Entry does not exist')
        latest_entry = None
    return render(request, 'journal/entry_success.html', {'entry': latest_entry})

3. 修复模型的字段缺失问题

模型save方法中使用的screen_time字段未定义,需添加到模型:

from django.contrib.auth.models import User
from django.db import models

class Entry(models.Model):
    auth_user_id = models.ForeignKey(User, on_delete=models.CASCADE, db_column='auth_user_id', default=1)
    mood = models.CharField(max_length=100)
    sleep_quality = models.IntegerField()
    heart_rate_min = models.IntegerField()
    heart_rate_max = models.IntegerField()
    exercise_duration = models.IntegerField()
    screen_time_hours = models.IntegerField()
    screen_time_minutes = models.IntegerField()
    sleep_duration = models.DecimalField(max_digits=5, decimal_places=2)
    energy = models.IntegerField()
    notes = models.TextField()
    # 添加缺失的screen_time字段
    screen_time = models.DecimalField(max_digits=5, decimal_places=2)

    def save(self, *args, **kwargs):
        self.screen_time = self.screen_time_hours + self.screen_time_minutes / 60.0
        super().save(*args, **kwargs)

    class Meta:
        managed = True
        db_table = 'journal_entry'

验证流程

  1. 运行python manage.py makemigrations和python manage.py migrate更新数据库
  2. 访问表单页面填写内容提交
  3. 提交后会跳转到success页面,此时显示的应为刚创建的新条目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:50:29