Django覆盖保存的表单数据

时间:2012-02-20 20:05:35

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

之前我已经发布了这个问题,但我还是没有找到解决方案,所以我希望这次运气好转。

我有一个用户输入数据的表格。在另一个页面中,我正在创建用户已填充的相同表单(预填充该信息)以进行编辑。用户将来到此页面编辑他们已经放入的信息。我的问题是它不会覆盖实例。

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”中定义的字段,则会返回错误,告知我该实例已存在。否则它会保存一个新实例。这不是OVERWRITING。

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

有什么想法吗?

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

3 个答案:

答案 0 :(得分:1)

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

def edit(request, pk):

   a = A.objects.get( pk = pk)
   ...

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您不应该在会话中保存对象。如果你真的需要使用一个会话 - 在那里保存一个PK并在将它提供给Form之前检索它。但更好的解决方案是将其发送到GET或POST参数中或包含在url中。会话不可靠,其中的数据可以在用户的​​请求之间销毁。

您可以用更加pythonic的方式从会话中检索值:

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