Django新增Book对象存储为NULL且表单提交后不跳转问题求助
问题修复方案
一、字段存NULL问题修复
导致该问题共有3处错误:
- 表单控件缺失
name属性:Django的request.POST完全依靠表单控件的name属性读取提交值,你的所有input、select只设了id未设name,导致所有取值都是None - 外键赋值逻辑错误:
Book的category是外键字段,不能直接传入分类名称字符串,需要传入对应Category实例或者主键ID - 查询集未调用执行:视图中
Category.objects.all没有加括号,传递给模板的是方法对象而非实际的分类查询结果
二、点击add不跳转问题修复
导致该问题共有2处错误:
- 路由配置缺失斜杠:Django默认开启
APPEND_SLASH配置,会对路径末尾没有斜杠的POST请求返回301重定向,跳转过程中会丢失所有POST数据导致请求失败 - 提交后未做重定向:直接
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
相关产品推荐
相关产品推荐

