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'
验证流程
- 运行
python manage.py makemigrations和python manage.py migrate更新数据库 - 访问表单页面填写内容提交
- 提交后会跳转到success页面,此时显示的应为刚创建的新条目
内容的提问来源于stack exchange,提问作者Misael Lopez
相关产品推荐
相关产品推荐

