Django无法新增Customer表记录且视图重定向异常求助
Django表单无法写入数据库+重定向错误的修复方案
问题根源
你的代码存在三处关键错误,导致记录无法存入数据库且重定向失败:
- 表单提交路径错误
- 重定向逻辑中调用了模型不存在的属性,且URL生成方式不规范
- 表单字段验证未匹配模型要求,同时视图未处理表单验证失败的场景
分步修复
1. 修正表单提交路径(模板文件)
原模板中form标签存在语法错误(多余逗号),且action路径硬编码错误,改为使用URL名称生成路径更可靠:
{%extends "main/base.html"%} {% block content %} <h1>Create Customer</h1> <form method="POST" action="{% url 'create-customer' %}"> {%csrf_token%} {{form.as_p}} <button type="Submit">Create Customer</button> </form> {% endblock %}
2. 修复视图函数逻辑
原视图在表单验证失败时无响应返回,且重定向调用了模型不存在的r.n属性,改用reverse生成URL更规范:
from django.shortcuts import render, redirect, reverse def create_customer(response): cust_form = createNewCustomer() if response.method == "POST": cust_form = createNewCustomer(response.POST) if cust_form.is_valid(): # 提取表单数据并保存 customer = Customer( id=cust_form.cleaned_data["id"], name=cust_form.cleaned_data["name"], category=cust_form.cleaned_data["category"] ) customer.save() # 根据URL名称生成跳转路径 return redirect(reverse("cust_index", kwargs={"n": customer.name})) # GET请求或表单验证失败时,返回带表单的页面 return render(response, "main/create-customer.html", {"form": cust_form})
3. 对齐表单与模型的字段验证
模型中id是PositiveSmallIntegerField,但原表单用普通IntegerField未限制正整数,可能导致非法数据无法保存,修改表单类:
class createNewCustomer(forms.Form): id = forms.PositiveIntegerField(label="id") name = forms.CharField(label="name", max_length=200) category = forms.CharField(label="category", max_length=1)
可选优化:使用ModelForm简化代码
用ModelForm替代普通Form,自动匹配模型字段,减少手动代码:
from django.forms import ModelForm class CreateNewCustomer(ModelForm): class Meta: model = Customer fields = ['id', 'name', 'category']
对应的视图可简化为:
def create_customer(response): if response.method == "POST": cust_form = CreateNewCustomer(response.POST) if cust_form.is_valid(): customer = cust_form.save() return redirect(reverse("cust_index", kwargs={"n": customer.name})) else: cust_form = CreateNewCustomer() return render(response, "main/create-customer.html", {"form": cust_form})
内容的提问来源于stack exchange,提问作者glitch_123
相关产品推荐
相关产品推荐

