为什么Django给我这个“违反notnull约束”错误?

2024-09-28 22:01:48 发布

您现在位置:Python中文网/ 问答频道 /正文

错误:

null value in column "postal_code_id" violates not-null constraint

表格:

def add(request):
    if request.method == 'POST':
        address_form = AddressForm(request.POST)
        company_form = CompanyForm(request.POST)
        if address_form.is_valid() and company_form.is_valid():
            print address_form.cleaned_data['postal_code'] # <-- prints (<PostalCode: V4N 1K6>, False)
            address_form.save() # <------------------------------- occurs here
        else:
            print 'Address errors',address_form.errors
            print 'Company errors', company_form.errors
    else:
        address_form = AddressForm()
        company_form = CompanyForm()
    return render(request, 'company/add.html', locals())

显然,表单确实有一个有效的PostalCode对象,所以我不知道它为什么说它违反了notnull约束。当然,我对表格做了一些有趣的事情:

^{pr2}$

具体来说,我用文本字段替换postal_code字段,然后在“clean”方法中找到/创建对象。为什么这让Django感到困惑?它最终得到了它需要的东西,不是吗?在


Tags: formaddifaddressrequestcodepostnull
3条回答

您排除了postal_code,这将导致模型表单稍后在保存尝试期间跳过该字段。我也遇到过类似的问题,必须通过django代码来找出行为。顺便说一下,这是值得的。在

相反,您要做的是设置用于邮政编码字段的小部件,而不是排除然后包括。在

class AddressForm(ModelForm):
    class Meta:
        model = Address
        widgets = {
            'postal_code': CharField(max_length=10),
        }

这将允许modelform正确验证字段并保存它。为了简洁起见,我把你剩下的表格删去了。在

编辑:

在ModelForm中,尝试使用CharField作为ForeignKey是非常可怕的。相反,将其转换为常规形式。您似乎已经定义了大部分字段。然后依靠您来验证字段是否有效,并且已经是数据库的成员。创建一个行为类似于ModelForm保存方法的save方法,然后就可以开始了。在

我提出这个问题是因为我试图在保存表单之前自动向表单数据添加一个uploaded_by字段。我使用的是ModelForm,排除了uploaded_by。我发现对related stackoverflow question的回答是对这个问题的简洁解决方案。在

我不知道Django,但也许你必须确保在保存地址之前保存了邮政编码?在

相关问题 更多 >