Django覆盖表单数据保存

问题描述:

我之前发布过关于这个问题的文章,但是我仍然没有找到解决方案,所以我希望这次能有更好的运气。Django覆盖表单数据保存

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

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”是指包含所有可用实例的下拉框的会话。结转后将指示用户想要编辑哪个实例。 `

+1

在以前的观点,你有没有保存“a”到数据库中,你将它添加到会话之前?如果你打印一个.id(我怀疑它可能是'None'),会发生什么? – Alasdair 2012-02-20 20:10:15

+0

是的,它们被保存到数据库..当我打印它时,实际上给了我ID ..不仅如此,而且它成功预先填写a的所有字段的形式,所以它肯定会将其结束。 – JohnnyCash 2012-02-20 20:35:04

+0

“a”引用另一个视图中的下拉框,用户将选择该下拉框来指示他们想要编辑的实例 – JohnnyCash 2012-02-20 20:36:45

为什么不这样做你想要保存和拉离领域模型的数据库查询形成模型然后保存模型?

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

def edit(request, pk): 

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

PKa标识,你可以把它通过urls.py.查看我鼓励你使用POST/Redirect/GET模式。

您可以在自己的模型来控制流程(草案有效)添加一个“状态”栏

+0

模型被保存在数据库中..“a”是指在另一个视图中的下拉框,用户将选择它将指示他们想编辑的WHICH实例。 – JohnnyCash 2012-02-20 20:37:30

+0

我建议你改变方法来将实例转换到视图。使用网址而不是会话。 – danihp 2012-02-20 20:41:26

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

而且你可以在一个更Python的方式检索会话值:

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