2012-02-20 14 views
0

これまでにこの問題について投稿しましたが、まだ解決策が見つかりませんでしたので、今回はもっとうまくいくと思っています。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を使用している理由は、ユーザーが最初に同じフォームを2回入力するのを防ぐためです(編集段階の前に、最初の入力ビューで)。

アイデア?

EDIT: "a"は、使用可能なすべてのインスタンスのドロップダウンボックスを含むセッションを指します。これは、ユーザーが編集したいインスタンスを示します。 `

+1

、あなたがセッションに追加する前に、あなたは「」データベースに保存されていますか? a.idを印刷するとどうなりますか(私は 'None'と思われます) – Alasdair

+0

はい、それらはデータベースに保存されています。印刷すると実際に私にIDだけが与えられます。それだけでなく、正常ですaのすべてのフィールドでフォームをあらかじめ準備しておくので、間違いなくそれを運んでいます。 – JohnnyCash

+0

"a"は、ユーザーが選択する別のビューのドロップダウンボックスを参照します。これは、編集したいインスタンスを示します。 – JohnnyCash

答えて

1

あなたが保存してからフィールドを引くしようとしているモデルのデータベース検索をしないのはなぜフォームをモデルに保存してモデルを保存しますか?

1

モデルaをセッションに保存する代わりに、データベースに保存する必要があります。そして、それを編集:

def edit(request, pk): 

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

PKそれはa識別子、あなたがurls.py.経由で閲覧するためにそれを送ることができます私はあなたにPOST/Redirect/GETパターンを使用することをお勧めします。

ワークフローを制御するために、あなたのモデル(ドラフト有効)に「状態」フィールドを追加することができます

+0

モデルはデータベースに保存されています.. "a"は、ユーザーが選択する別のビューのドロップダウンボックスを指します。 – JohnnyCash

+0

インスタンスを表示するようにメソッドを変更することをお勧めします。セッションの代わりにURLを使用してください。 – danihp

0

セッションにオブジェクトを保存しないでください。本当にセッションを使用する必要がある場合は、そこにPKを保存し、オブジェクトをFormに渡す前にオブジェクトを取得してください。しかし、より良い解決策は、GETまたはPOSTパラメータで送信するか、URLに含めることです。セッションは信頼性が低く、内部のデータはユーザーの要求の間に破棄される可能性があります。

そして、あなたはより多くのニシキヘビの方法でセッションから値を取得することができます以前のビューで

try: 
    a = request.session['a'] 
except KeyError: 
    raise Http404('a was not found') 
関連する問題