Django formset下拉选择框option的value属性为None问题排查
问题原因及修复方案
下拉<option>的value属性对应关联模型实例的主键值,你这里value为None,核心原因是渲染下拉选项的product_list实例没有主键,大多由实例未写入数据库、模型配置错误导致,可按以下步骤修复:
修正
product_list模型的错误字段配置auto_created是Django内部保留参数,不要手动设置,原错误配置:date=models.DateField(auto_created=True,auto_now_add=timezone.now()) model=models.ForeignKey(WarehouseUpdateForm, null=True,default=None,blank=True, on_delete=models.CASCADE)修正后写法:
# 时间字段仅保留auto_now_add即可自动填充创建时间 date=models.DateField(auto_now_add=True) model=models.ForeignKey(WarehouseUpdateForm, null=True, blank=True, on_delete=models.CASCADE)同时确认你创建
product_list实例后调用了.save()方法写入数据库,只有保存后的实例才会生成主键ID。修正
orderlist模型外键配置
你给model外键字段设置了blank=True但没加null=True,数据库层面不允许外键字段为空,会引发保存异常,修正为:model=models.ForeignKey(product_list,blank=True, null=True, on_delete=models.CASCADE)另外
orderlist的__str__方法直接返回外键实例,如果外键为空会触发报错,优化为:def __str__(self): return str(self.model) if self.model else ""修正formset的初始化逻辑
formset_factory的extra参数仅指定空表单的数量,如果你需要把get_all_product的内容作为初始值填充到formset,需要在实例化formset时传入initial参数,示例:orderformset = formset_factory(orderform, extra=len(get_all_product), max_num=10) # 传入初始值 formset = orderformset(initial=[{"model": item} for item in get_all_product])(可选)自定义下拉选项查询集
如果需要显式控制下拉选项的范围,可在orderform中手动指定外键字段的查询集:class orderform(ModelForm): model = ModelChoiceField(queryset=product_list.objects.all()) class Meta: model = orderlist fields= ('model','quantity')
内容的提问来源于stack exchange,提问作者anirban
相关产品推荐
相关产品推荐

