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

Django无法新增Customer表记录且视图重定向异常求助

Django表单无法写入数据库+重定向错误的修复方案

问题根源

你的代码存在三处关键错误,导致记录无法存入数据库且重定向失败:

  1. 表单提交路径错误
  2. 重定向逻辑中调用了模型不存在的属性,且URL生成方式不规范
  3. 表单字段验证未匹配模型要求,同时视图未处理表单验证失败的场景

分步修复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:55:31