如何使用外键保存多个Django表单?

时间:2019-05-01 12:22:47

标签: python django

我知道之前已经有人问过这个问题,因此我采用了建议的解决方案,但是我的代码仍然无法正常工作。我正在尝试保存3种形式,其中一种模型具有其他两种的外键。我先尝试commit=false,然后保存,但仍然得到IntegrityError。以下是追溯的详细信息:

  

_execute中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ backends \ utils.py”     85. return self.cursor.execute(sql,params)

     

上述异常(“ poi_id”列中的空值违反了非空约束   详细信息:失败行包含(14,SOME STRING,2019-05-01,media / Live-Oak-Tree-450w_iWBYljS.jpg,null,null)。   )是以下异常的直接原因:

     

内部的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ core \ handlers \ exception.py”     34. response = get_response(request)

     

_get_response中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ core \ handlers \ base.py”     126. response = self.process_exception_by_middleware(e,request)

     

_get_response中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ core \ handlers \ base.py”     124. response = wrapd_callback(request,* callback_args,** callback_kwargs)

     

观察中的文件“ C:\ testBioDjango \ SpeciesColl \ polls \ views.py”     52. obs.species = species_form.save()

     

保存文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ forms \ models.py”     458. self.instance.save()

     

保存文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ models \ base.py”     718. force_update = force_update,update_fields = update_fields)

     

save_base中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ models \ base.py”     748.更新= self._save_table(原始,cls,force_insert,force_update,使用,update_fields)

     

_save_table中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ models \ base.py”     831. result = self._do_insert(cls._base_manager,using,fields,update_pk,raw)

     

_do_insert中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ models \ base.py”     869. using = using,raw = raw)

     

manager_method中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ models \ manager.py”     82. return getattr(self.get_queryset(),name)(* args,** kwargs)

     

_insert中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ models \ query.py”     1136. return query.get_compiler(using = using).execute_sql(return_id)

     

execute_sql中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py”     1289. cursor.execute(sql,params)

     

在执行文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ backends \ utils.py”     100. return super()。execute(sql,params)

     

在执行文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ backends \ utils.py”     68. return self._execute_with_wrappers(sql,params,many = False,executor = self._execute)

     

_execute_with_wrappers中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ backends \ utils.py”     77. return executor(sql,params,many,context)

     

_execute中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ backends \ utils.py”     85. return self.cursor.execute(sql,params)

     

退出中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ utils.py”     89.从exc_value提高dj_exc_value.with_traceback(traceback)

     

_execute中的文件“ C:\ Users \ user \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ backends \ utils.py”     85. return self.cursor.execute(sql,params)

     

异常类型:/ polls / observe /处的IntegrityError   异常值:“ poi_id”列中的空值违反了非空约束   详细信息:失败行包含(14,SOME STRING,2019-05-01,media / Live-Oak-Tree-450w_iWBYljS.jpg,null,null)。

1 个答案:

答案 0 :(得分:1)

分配表格时,您正在交换表格的名称:

species_form = ObservationForm(request.POST, request.FILES)

这就是问题所在。

您自己如何看待它:正如Daniel指出的那样,错误跟踪显示错误发生在species_form.save()上(在错误跟踪中查找具有您自己代码路径的行,而不是python / site-packages / django / ...的路径。但是在跟踪的更深处,您可以看到失败行的值:(14, SOME STRING, 2019-05-01, media/Live-Oak-Tree-450w_iWBYljS.jpg, null, null)显然是指Observation模型。因此species_form保存了错误的模型。