【问题标题】:Django Overwrite existing instance in tableDjango覆盖表中的现有实例
【发布时间】:2012-02-16 23:15:34
【问题描述】:

我正在一个页面中创建一个表单,然后在另一个页面中我试图拉出表单(填充了已经保存在其中的数据)并希望对其进行更改,以便在我保存它时它会覆盖实例而不是创建另一个实例。

def edit(request):

   a = request.session.get('a',  None)

   if a is None:
       raise Http404('a was not found')

   if request.method == 'POST':
       form = Name_Form(request.POST, instance=a)
       if form.is_valid():
           j = form.save( commit=False )
           j.save()
   else:
       form = Name_Form( instance = a )

这是我用于“编辑表单”视图的代码。当我打开此页面时,表单已成功预填充所有数据。但是,当我进行更改并保存时,它不会覆盖现有实例,而是创建一个新实例。

有什么想法吗?

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    看看这里:https://docs.djangoproject.com/en/dev/ref/models/instances/#how-django-knows-to-update-vs-insert 我想这可能会对你有所帮助。

    更新: 尝试一种更“明确”的方式怎么样。 假设, id_of_Name 仅存储要编辑的模型的 id 或 pk(我假设模型称为“名称”)。然后只需从会话中检索 id/pk 即可在您的数据库中查询模型实例。也可以尝试直接调用表单上的save方法。

    def edit(request):
    
       id_of_Name = request.session.get('a',  None)
    
       if id_of_Name is None:
           raise Http404('id_of_Name was not found')
       instance = Name.objects.get(pk=id_of_Name)
       if request.method == 'POST':
           form = Name_Form(request.POST, instance=instance)
           if form.is_valid():
               form.save()
       else:
           form = Name_Form( instance = instance )
    

    【讨论】:

    • hmm,那么看起来pk在这个过程中丢失了。 save(force_update=True) 不起作用吗?
    • re: 编辑我这样做时遇到类型错误... int() 参数必须是字符串或数字,而不是“名称”,老实说,我很困惑.. 真正驱使我的是什么疯狂的是我的原始代码似乎在某一时刻工作!逻辑似乎很合理!我不明白为什么它不会覆盖实例...... grrr
    • 不要将整个对象实例放入a,只放入id/pk。那么应该没有类型错误。
    • 这样就可以摆脱错误了!但是我们回到我们最初的问题,它试图创建一个新实例,当一个实例已经存在时,它会抛出一个错误说明。所以仍然没有覆盖:S
    • 错误信息是我自定义的。这是由于模板中的 non_field_error 而被退回的那个。 (我将字段定义为 unique_together)
    猜你喜欢
    • 2013-03-17
    • 2015-10-23
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2015-02-14
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多