2011-01-12 9 views
2

私は、データがExcelスプレッドシートを含むさまざまなソースから来るDjangoアプリケーションを作成しています。私はそれらのシートから最初のインポートを行うためのコードを書いたことがありますが、行が追加されるたびにデータ全体を再インポートするのは嫌いです。クライアントは自分自身でデータを再入力したくない。データをdjangoの管理フォームに投稿する

可能な解決策は、ユーザは、スプレッドシートの行全体をコピー&ペーストできる単純なテキストエリアにフォームを追加することです。次に、ビューはデータを分割して前処理し、対応するオブジェクトの標準管理フォームに投稿することができます。

理想的には、ユーザーがこのフォームから実際に投稿したように動作します。データが検証された場合、オブジェクトが作成され、作成されていない場合は管理者フォームが赤色のエラーボックスで再表示されます。

は、だから、私はちょうど

from django.shortcuts import redirect 
[...] 
return redirect(to, method=POST, *args) 

ようなものが必要だろうと思ったが、利用可能ではないようです。

私はhttp://.../admin/app/object/add/?ID=1234&name=toto&のような大きなクエリ文字列としてデータを渡すことも考えましたが、私のモデルには1対多と多対多のインライン、長いテキストフィールドなどがあるため、多くのフィールドがあります。アプローチは必要以上のトラブルのようです。

POSTリダイレクトのようなものを取得するにはどうすればよいですか?またはこの問題に対する別のアプローチですか?

+0

ユーザーにcsvファイルをアップロードさせるのはどうですか? –

+0

https://stackoverflow.com/questions/4952222/build-a-two-stage-django-admin-form-for-adding-an-object – Miranda

答えて

1

このため、組み込みの管理インターフェイスから離れる必要があります。

検証とPOSTを行い、独自のビュー関数を作成し、独自のModelFormhttp://docs.djangoproject.com/en/dev/topics/forms/modelforms/

を作成します。

これは、おそらく2ステップトランザクションである必要があります。

view_function_1

  • 方法は、空のフォームを提示し、GETである場合。メソッドがPOSTであれば

  • は、彼らがテキストボックスに値を貼り付けると「その他」の欄に記入しています。

    テキストボックスのデータを解析します。空になっているフィールドの場合

    、テキストボックスから欠損値を埋めます。

    セッションのデータをセッションに入れます。

    view_function_2

view_function_2

  • 方法は、GETセッションからフォームデータを取得し、 現在で物事を記入している場合に移動しますURLへのリダイレクトを実行します。フォームにデータがあります。メソッドがPOSTの場合

  • 、検証し、結果を保存します。

    詳細をユーザーに表示するページにリダイレクトします。

2

すでにフォームに固有のコードを書いているなら、なぜ代わりにadminサイトに偽にPOST要求をしようと、同じ関数内でオブジェクトを作成していませんか?

既定の管理フォームを使用するのは、既存の前処理ビューを使用してオブジェクトの作成または更新を開始するよりも困難です。

私はちょうど

<form action="." method="post"> 
    <textarea name="data"></textarea> 
    <input type="submit" value="submit" /> 
</form> 

のような単純なものと手動入力フォームのデータを処理できるテンプレートを設定get_urls方法を経由してあなたのModelAdmin定義のために、前処理ビューをフックアップしたいですrequest.POST.get('data', '').split(',')(または何を持っているか)を入力して、モデルの作成を開始します。

完了したら、メッセージを送信して、アプリビューまたはチェンジリストビューにリダイレクトします。

request.user.message_set.create(message="Finished populating X models") 
return http.HttpResponseRedirect('../') 
+0

に関連しています。ここで入力フォーム要求のデータを処理する必要があります。 POST.get( 'data'、 '').split( '、') "? – Brent81

+0

@ Brent81、あなたは管理者 'get_urls'(投稿のドキュメントへのリンク)にフックしています –

1

お返事ありがとうございました!

@Yuji - 管理フォーム(またはその問題については、任意のModelForm)を使用したい理由は、主にエラー報告です。データにはエラーが含まれている可能性があります。 5つの異なる言語は、管理アプリに既に非常に細かいものが存在するため、私にはあまりDRYしていないようです。

@S。 Lott - 私は、ModelFormで管理者を置き換えることを考えていましたが、欠けている部分は、セッションにフォームのデータを格納するという考えでした。これは非常に有望なアプローチのようです。私はそれを試し、ここに戻ってそれがどのように行ったかを報告します。

関連する問題