Django使用CBVs保存表单后在视图中执行方法的问题
问题分析与解决方案
你的核心问题有两个:一是inc_rec方法没被触发执行,二是错误地尝试从self.request.id获取保存后的Company ID(这个属性根本不存在)。下面给出两种可行的修正方案:
方案一:重写form_valid方法(视图内绑定逻辑)
直接在表单验证通过并保存Company实例后,调用inc_rec方法并传入新创建的Company对象,这样就能拿到正确的ID:
class ParishCreateView(LoginRequiredMixin, CreateView): model = Company fields = ['str_Company_Name', 'str_City','str_post_code'] def form_valid(self, form): form.instance.author = self.request.user # 先手动保存表单,获取新创建的Company实例 self.object = form.save() # 调用inc_rec并传入实例 self.inc_rec(self.object) # 执行父类的form_valid完成跳转逻辑 return super().form_valid(form) def inc_rec(self, company): # 变量名不要和模型名重名,避免覆盖引用 checklists = Checklist.objects.all() # 批量创建更高效,也可以循环逐个创建 inspection_records = [ All_Inspection( str_status=rec.str_status, str_check=rec.str_check, str_comment='', company=company # 直接关联对象,比传id更安全 ) for rec in checklists ] All_Inspection.objects.bulk_create(inspection_records)
方案二:使用post_save信号(全局触发逻辑)
如果所有创建Company的场景(包括后台管理、其他视图)都需要同步生成All_Inspection记录,用信号更合适:
# 在models.py或者signals.py中添加 from django.db.models.signals import post_save from django.dispatch import receiver from .models import Company, Checklist, All_Inspection @receiver(post_save, sender=Company) def sync_inspection_records(sender, instance, created, **kwargs): # 只在创建新Company时执行,更新时不触发 if created: checklists = Checklist.objects.all() inspection_records = [ All_Inspection( str_status=rec.str_status, str_check=rec.str_check, str_comment='', company=instance ) for rec in checklists ] All_Inspection.objects.bulk_create(inspection_records)
注意:如果用信号,需要确保信号被Django加载,比如在apps.py的ready方法中导入信号模块。
关键修正点说明
- ID获取方式:通过保存后的
Company实例(self.object或instance)直接获取ID,而不是从request里找不存在的属性。 - 避免变量名冲突:不要用
Checklist作为变量名,会覆盖模型类的引用,改成checklists更规范。 - 批量创建优化:用
bulk_create代替循环save,减少数据库查询次数,提升性能。
内容的提问来源于stack exchange,提问作者Dev_Frameworks
相关产品推荐
相关产品推荐

