スポンサードリンク



こんにちは。sinyです。

この記事では、Djangoで複数フォームを1テンプレート内に表示する方法について試行錯誤した際の対応をまとめました。

今回説明する以下のデモでは、学習用データのアップロードとテスト用データのアップロードを異なるタブ上(同じテンプレートファイル上)で実行したいようなケースを想定して作成しています。

 

モデルの定義

今回は、学習用データファイル(UploadTrainData)とテスト用ファイル(UploadTestData)のファイルアップロード用のモデルクラスを以下の通り定義します。

 

学習用データは 「upload_to='train_data/」、テスト用データは「upload_to='test_data/」としてアップロード先のフォルダを分けています。

あわせて、メディアファイルの設定としてsettings.pyに以下の設定を行っておきます。

アップロード先のフォルダも以下の通り作成しておきます。

<プロジェクト>medial\train_data
<プロジェクト>medial\test_data

フォームの定義

フォームについても、学習用データとテスト用データのアップロードフォームをそれぞれ定義しておきます。

今回はModelFormを使って先ほど定義したモデルの定義を使っています。

 

ビューの定義

続いてビューの定義です。
今回はTemplateViewを承継してUploadViewというクラスを定義しています。

 

 

まず、学習用データとテスト用データのアップロードフォームを別々に定義します。

 

postメソッドを新たに定義して、テンプレート側からのリクエストオブジェクトをそれぞれtrain_form、test_formとして受け取ります。

さらにget_context_dataメソッドをオーバーライドしてtrain_formとtest_formをテンプレートに渡せるようにします。

 

続いて、postメソッドの後半部分です。

 

train_formとtest_formに対してis_valid()メソッドを実行して、バリデーションチェックOKの場合にform_saveメソッドをCALLしてファイルを保存するようにします。

CALLするform_saveメソッドは以下の通りで、formのsaveメソッドを実行してフォーム(ファイル)を保存してあげます。

 

テンプレートファイルの設定

テンプレートはbase.htmlとmain.htmlの2つを作成します。

まずは共通テンプレートbase.htmlです。

 

bootstrapとJQueryを利用するためにCDNを利用している以外は特段ないです。

最後にmain.htmlです。

 

タブの切り替え実装については省略しますが、以下の記事を参考にしました。

 

今回は、「学習データロード」、「テストデータロード」、「学習」という3つのタブを定義しています。
各タブ内の設定で、以下の通りそれぞれフォームを指定することでタブ毎に異なったフォームを表示させます。

  • 「学習データロード」タブ
       → train_formフォームを指定  {{train_form.trainFile}}

  • 「テストデータロード」タブ
       → test_formフォームを指定   {{test_form.testFile}}

以下は、ファイルアップロード完了時のメッセージを表示させるために設定しています。

 

以上で、デモ動画のような画面が完成します。

 

おすすめの記事