Django出现IntegrityError(1048):item_id_id列不能为NULL求助
解决Django提交SupplyItem表单时的IntegrityError(1048, "Column 'item_id_id' cannot be null")
错误核心原因
表单自定义字段名与模型字段名不匹配,导致Django无法自动将表单数据映射到模型的外键字段;同时表单的clean方法逻辑存在问题,无法有效校验必填字段,最终触发数据库非空约束错误。
具体修复步骤
1. 修正表单字段与模型字段的映射
直接使用模型原生字段名,通过labels和widgets配置显示样式,避免自定义字段名导致的映射失败。修改forms.py如下:
from django import forms from .models import supplyItem, Supplier from Items.models import Items class SupplyItemForm(forms.ModelForm): class Meta: model = supplyItem fields = ['item_id', 'supplier_id', 'numOfItemsS'] # 配置前端显示的标签名 labels = { 'item_id': 'Item name', 'supplier_id': 'Supplier Company', 'numOfItemsS': 'Quantity' } # 配置输入控件类型 widgets = { 'item_id': forms.Select(), 'supplier_id': forms.Select(), 'numOfItemsS': forms.NumberInput() } def clean_numOfItemsS(self): qty = self.cleaned_data.get('numOfItemsS') if qty <= 0: raise forms.ValidationError('Quantity must be a positive number!') return qty def clean_item_id(self): data = self.cleaned_data.get('item_id') if not data: raise forms.ValidationError('Please select a value!') return data def clean_supplier_id(self): data = self.cleaned_data.get('supplier_id') if not data: raise forms.ValidationError('Please select a value!') return data
2. 修复clean方法逻辑错误
- 用
self.cleaned_data.get()替代self.data.get(),避免手动类型转换出错(cleaned_data已完成Django自动类型转换) - ModelChoiceField未选择时返回
None而非空字符串,因此用if not data判断空值
3. 优化视图逻辑(可选)
在post方法中添加表单验证失败的提示,同时支持提交成功后的重定向:
from django.shortcuts import render, redirect from django.contrib import messages from .forms import SupplyItemForm class SupplyItem(View): template = 'SupplyItems.html' def get(self, request): form = SupplyItemForm() return render(request, self.template, {'form': form}) def post(self, request): form = SupplyItemForm(request.POST) if form.is_valid(): form.save() messages.success(request, 'Supply item added successfully!') return redirect('supply_items') # 替换为你的目标URL名称 return render(request, self.template, {'form': form})
4. 修正Items模型的缩进问题
确保__str__方法属于Items类:
class Items(models.Model): item_id = models.AutoField(primary_key=True) item_name = models.CharField(max_length=50, null=False) item_qty = models.IntegerField(null=False) item_prc = models.FloatField(null=False) purchase = models.ManyToManyField('registration.Customer', through='Purchase.purchasedItem', related_name='items', blank=True) sell = models.ManyToManyField('registration.Employee', through='Sell.sellItem', related_name='items', blank=True) def __str__(self): return self.item_name
内容的提问来源于stack exchange,提问作者Jikk
相关产品推荐
相关产品推荐

