之前我已经发布了这个问题,但我还是没有找到解决方案,所以我希望这次运气好转。
我有一个用户输入数据的表格。在另一个页面中,我正在创建用户已填充的相同表单(预填充该信息)以进行编辑。用户将来到此页面编辑他们已经放入的信息。我的问题是它不会覆盖实例。
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”是指包含所有可用实例的下拉框的会话。这个结转将指示用户想要编辑的实例。 `
答案 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')