3

私はモデルフォームを持っています:

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 データで更新されます。代わりに、新しいオブジェクトが作成され、データベースに保存されていることがわかります。何が悪かったのか?どうもありがとう。

【追記】本当にお恥ずかしい限りです。コードには実際に問題はありません。すべてを台無しにした唯一のことは、テンプレートに追加したアクションでした (スニペットの追加と編集に同じテンプレートを使用しているため)。

4

1 に答える 1

1

なぜそれが起こるのかわかりません。ジャンゴのバージョンは何ですか?

いずれの場合でも、対応する引数を渡して手動で更新を強制できます。

form = SnippetForm(data=request.POST, instance=snippet, force_update=True)
于 2011-01-20T06:51:59.213 に答える