【发布时间】: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