私はモデルフォームを持っています:
class SnippetForm(ModelForm):
class Meta:
model = Snippet
exclude = ['author', 'slug']
これを使用して特定のインスタンスを編集できるようにしたい:
def edit_snippet(request, snippet_id):
#look up for that snippet
snippet = get_object_or_404(Snippet, pk=snippet_id)
if request.user.id != snippet.author.id:
return HttpResponseForbidden()
if request.method == 'POST':
form = SnippetForm(data=request.POST, instance=snippet)
if form.is_valid():
form.save()
return HttpResponseRedirect(snippet.get_absolute_url())
else:
form = SnippetForm(instance=snippet)
return render_to_response(SNIPPET_EDIT_TEMPLATE,
{'form':form, 'add':False, 'user':request.user},
RequestContext(request))
行にあることに注意してください
form = SnippetForm(data=request.POST, instance=snippet)
、ユーザーから提供されたデータを使用するフォームを作成し、(url から受け取った) 主キーを使用して見つかったインスタンスにバインドしました。django documentationによると、save() を呼び出すと、既存のインスタンスが POSTED データで更新されます。代わりに、新しいオブジェクトが作成され、データベースに保存されていることがわかります。何が悪かったのか?どうもありがとう。
【追記】本当にお恥ずかしい限りです。コードには実際に問題はありません。すべてを台無しにした唯一のことは、テンプレートに追加したアクションでした (スニペットの追加と編集に同じテンプレートを使用しているため)。