【问题标题】:Django Overwrite form data savedDjango覆盖表单数据保存
【发布时间】:2012-02-20 20:05:35
【问题描述】:

我之前已经发布过这个问题,但我仍然没有找到解决方案,所以我希望这次我能有更好的运气。

我有一个接受用户输入数据的表单。在另一个页面中,我正在创建用户已填充(预填充该信息)用于编辑目的的相同表单。用户将来到这个页面来编辑他们已经输入的信息。我的问题是它没有覆盖实例。

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 )

对于这个表单,我将“unique_together”用于某些值。我还在模板中调用了`{{ form.non_field_errors }}。

当我在编辑视图中进行更改时,如果字段更改涉及“unique_together”中定义的字段,则会返回一个错误,告诉我该实例已经存在。否则它会保存一个新实例。它不是覆盖。

请注意,我使用 unique_together 的原因是我想防止用户最初输入相同的表单两次(在编辑阶段之前,在初始输入视图中)。

有什么想法吗?

编辑:请注意,“a”是指包含所有可用实例的下拉框的会话。此结转将指示用户想要编辑的实例。 `

【问题讨论】:

  • 在上一个视图中,您是否在将“a”添加到会话之前将其保存到数据库中?如果你打印 a.id 会发生什么(我怀疑它可能是 None
  • 是的,它们已保存到数据库中.. 当我打印时,它实际上给了我 id.. 不仅如此,它还成功地用 a 的所有字段预填充了表单,所以它肯定会把它带过去。
  • 我仍然对a 应该是什么感到困惑。你一直说它是一个下拉框,但你已经将它用作instance 参数 - 那么它是NameForm 正在编辑的任何模型的实例吗?我认为我们需要查看创建a 的代码,以及模型本身。
  • 实例参数必须是一个带有pk的模型实例。否则,您的表单将始终在数据库中插入一个新项目。如果“a”不是您要编辑的模型实例,则不能将其用作实例参数。
  • 您是否在收到 POST 请求时检查了“a”是否仍然保持正确的值?顺便说一句:我还建议您使用 url 来获取“a”

标签: django django-models django-forms django-views


【解决方案1】:

为什么不对您尝试保存的模型进行数据库查找并将字段从表单提取到模型然后保存模型?

【讨论】:

    【解决方案2】:

    而不是将模型a 存储在会话中,您应该将其存储在数据库中。然后编辑它:

    def edit(request, pk):
    
       a = A.objects.get( pk = pk)
       ...
    

    pk 它是a 标识符,您可以通过urls.py 将其发送到查看。我鼓励你使用POST/Redirect/GET 模式。

    您可以在模型上添加“状态”字段来控制工作流程(草稿有效

    【讨论】:

    • 模型保存在数据库中。“a”指的是用户将选择的另一个视图中的下拉框,该下拉框将指示他们要编辑的实例。
    • 我建议您更改将实例翻译为视图的方法。使用 url 代替 session。
    【解决方案3】:

    您不应该在会话中保存对象。如果您确实需要使用会话 - 将 PK 保存在那里并在将其提供给 Form 之前检索对象。但更好的解决方案是在 GET 或 POST 参数中发送或包含在 url 中。会话是不可靠的,其中的数据可能会在用户请求之间被破坏。

    您可以以更 Pythonic 的方式从会话中检索值:

    try:
        a = request.session['a']
    except KeyError:
        raise Http404('a was not found')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2011-08-17
      • 2015-11-01
      • 1970-01-01
      • 2018-10-07
      • 2015-08-01
      相关资源
      最近更新 更多