Django使用Leads模型数据填充Deal表单时service字段未填充问题
问题根本原因
字段类型不匹配:
你的Deal模型中service字段定义为关联Leads表的外键类型,外键类型的字段仅支持接收关联模型的实例、或者实例的主键值,而你传入的初始值是Leads.services字段的字符串值(比如示例中的Software License),类型不匹配导致初始值无法填充到表单。
同时你当前的模型设计存在不合理的地方:Deal表的service、licenses字段都设为Leads外键完全不符合业务需求,你本质是要存储从Leads同步过来的服务类型、许可数量的数值,而非关联Leads记录。
修复步骤
- 修改
models.py中的Deal模型定义,调整两个字段的类型:
class Deal(models.Model): project_id = models.ForeignKey(Leads, on_delete=models.CASCADE, default='id') agent = models.ForeignKey(Profile, on_delete=models.CASCADE, default="agent") # 改为和Leads.services同类型的CharField,直接复用Leads的选项配置 service = models.CharField(choices=Leads._meta.get_field('services').choices, max_length=40) closing_date = models.DateField(auto_now_add=True) client = models.ForeignKey(Client, on_delete=models.CASCADE,default='client') # 改为IntegerField存储许可数量 licenses = models.IntegerField(blank=True) revenue = MoneyField(max_digits=14, decimal_places=2, default_currency='USD') comments = models.TextField(blank=True,null=True) company = models.ForeignKey(Company, on_delete=models.CASCADE)
- 执行数据库迁移命令更新表结构:
python manage.py makemigrations python manage.py migrate
- 可选优化:你当前POST请求中从GET参数获取
project_id的逻辑存在风险,如果POST请求的URL未携带该参数会导致找不到对应Leads记录,建议你把project_id放到URL路径参数中,或者在表单内增加隐藏字段存储该值,保证提交时参数可以正常获取。
内容的提问来源于stack exchange,提问作者Francisco Colina
相关产品推荐
相关产品推荐

