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

Django新增Book对象存储为NULL且表单提交后不跳转问题求助

问题修复方案

一、字段存NULL问题修复

导致该问题共有3处错误:

  1. 表单控件缺失name属性:Django的request.POST完全依靠表单控件的name属性读取提交值,你的所有input、select只设了id未设name,导致所有取值都是None
  2. 外键赋值逻辑错误:Book的category是外键字段,不能直接传入分类名称字符串,需要传入对应Category实例或者主键ID
  3. 查询集未调用执行:视图中Category.objects.all没有加括号,传递给模板的是方法对象而非实际的分类查询结果

二、点击add不跳转问题修复

导致该问题共有2处错误:

  1. 路由配置缺失斜杠:Django默认开启APPEND_SLASH配置,会对路径末尾没有斜杠的POST请求返回301重定向,跳转过程中会丢失所有POST数据导致请求失败
  2. 提交后未做重定向:直接render返回Menu页面不会跳转地址,且没有传递Menu需要的categories参数,会导致页面渲染异常

完整修改代码

1. 修改AddBook.html表单

<form action="{% url 'Blog:add_book' %}" method="POST">
    {% csrf_token %}
    <div class="form-row">
        <div class="form-group col-md-6">
            <label for="author">Author</label>
            <!-- 新增name属性 -->
            <input type="text" class="form-control" id="author" name="author" placeholder="Author">
        </div>
        <div class="form-group col-md-6">
            <label for="cover_img">Cover Image Link</label>
            <!-- 新增name属性 -->
            <input type="url" class="form-control" id="cover_img" name="cover_img" placeholder="Cover Image Link">
        </div>
    </div>
    <div class="form-group">
        <label for="summery">Summary</label>
        <!-- 新增name属性 -->
        <input type="text" class="form-control" id="summery" name="summery" placeholder="Summary">
    </div>
    <div class="form-group col-md-4">
        <label for="category">Category</label>
        <!-- 新增name属性 -->
        <select id="category" name="category_id" class="form-control">
            {% for i in categories %}
            <!--  value改为分类ID,方便外键赋值 -->
            <option value="{{ i.id }}">{{ i.category_name }}</option>
            {% endfor %}
        </select>
    </div>
    <input type="submit" class="btn btn-primary" value="add">
</form>

2. 修改views.py

from django.shortcuts import redirect, render, get_object_or_404
from .models import *

def first_page(request):
    # all方法加括号执行查询
    context = {"categories" : Category.objects.all()}
    return render(request, 'Menu.html', context)

def category_detail(request, id):
    # filter不会触发DoesNotExist异常,不需要try捕获
    my_object_base_category = Book.objects.filter(category__id=id)
    return render(request, "Book.html", {'key':my_object_base_category})

def add_a_new_book(request):
    # all方法加括号执行查询
    context = {"categories" : Category.objects.all()}
    if request.method == "POST":
        cover_img = request.POST.get('cover_img')
        author = request.POST.get('author')
        summery = request.POST.get('summery')
        category_id = request.POST.get('category_id')
        # 查询对应的分类实例赋值给外键
        category = get_object_or_404(Category, id=category_id)
        myobj = Book(cover_img = cover_img , author = author , summery = summery, category = category)
        myobj.save()
        # 提交成功后重定向到首页,避免重复提交
        return redirect('Blog:category_buttons')
    return render(request, 'AddBook.html',context)

3. 修改urls.py

from django.urls import path
from . import views

app_name = 'Blog'

urlpatterns = [
    path('Menu/', views.first_page, name='category_buttons'),
    path('<int:id>/', views.category_detail, name='cat_detail'),
    # 路径末尾加斜杠
    path('add/', views.add_a_new_book, name='add_book')
]

可选优化建议

后续可以使用Django自带的ModelForm来处理表单提交,自动完成字段校验、数据保存逻辑,不需要手动处理每个字段的取值和赋值,能避免大部分低级错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:57:00