その2管理サイト上のモデル編集(Django)DjangoPythonDjangoで簡単な投票アプリを作成します。Djangoの管理サイトからモデルを操作するためにカスタマイズします。投票アプリWebサイトのページから投票できる簡単な投票アプリを作成します。今回は、QuestionテーブルとChoiceテーブルを設定しています。前回はモデルを定義して、管理サイトから編集できるようにしました。今回は、エンティティ等のもう少し細かい設定を行います。Djangoのプロジェクトを作成済み。投票アプリ用モデル(Choice、Question)作成済み。仕様Webページにボタン等のフォームを配置します。ユーザが入力を終え、送信ボタンをクリックしたタイミングでモデル(テーブル)への登録処理を行います。当サイトでは、Vagrantでゲスト環境(仮想環境)を作ってDjangoを動かいていますが、それ以外の環境でも操作方法はだいたい同じです。1Djangoプロジェクトを生成します。プロジェクト生成)2Djangoアプリケーションを作ります。プロジェクトの初期設定)3投票アプリのモデルを定義します。7.1.1503pyenv1.1.3-5-g7dae197Anaconda3-4.3.0MariaDB5.5.52-1.el7Apache2.4.6mod_wsgi4.5.14Django1.11.3投票アプリ概要1以下のようなDjangoアプリ構成を作ります。プロジェクト名が「pj1」で、アプリケーション名が「users」です。プロジェクトの設定は済ませたものとします。赤字のファイルは、今回変更する部分です。pj1/pj1/__init__.pysettings.pyurls.pywsgi.pyusers/__init__.pyadmin.pyapps.pyurls.pyviews.pymodels.pytemplates/並び順のカスタマイズ管理サイトのモデルのデータの並び順を変更します。1デフォルトでは登録の降順ようになっています。これを公開日(pub_date)の新しいものから並べるように変更します。「users/models.py」に以下の記述をします。self.question_text変更はモデルのMetaクラスのorderingプロパティで設定します。設定値はフィールド名、降順にしたい場合は頭に「-」をつけます。質問内容順で並べ、同じ場合は公開日の降順で並べる場合は以下のように記述します。‘-pubdate’]relationのあるオブジェクトもう一つのモデルであるChoiceを追加します。Choiceモデルは、ForeignKey(Questionモデルへのリレーション)を持っています。1管理サイトに表示するモデルの設定やカスタマイズは、「app/admin.py」に記述します。今回はチュートリアルにならってusersアプリのQuestionモデルを追加します。Choiceadmin.site.register(Question)admin.site.register(Choice)2以下のURLをブラウザから開いて、Djangoの管理サイトを表示します。→http://localhost:8000/admin/以下のように追加されます。※ChoiceモデルはMeta設定などをしてないのでそのまま出ます。3「Questions」→「QUESTIONを追加する」を押すとデータ追加用のフォームが表示されます。以下のようにテストデータを入力して保存します。ForeignKeyフィールドの場合、Formでは上記のようにセレクトリストで表示されます。右側にある緑色のプラスボタンを押すことでQuestionオブジェクトを新しく作ることもできます。Adminサイト用モデルカスタマイズこのようにadmin.site.register関数でモデルを登録すれば、自動的に色々やってくれます。手を加えるだけでFormの内容変更やリストの表示、検索項目の追加など色々カスタマイズすることができます。カスタマイズするときはadmin.site.reigster関数の第2引数にAdminサイトでの振る舞いを記述したクラスを渡します。このクラスはadmin.ModelAdminクラスを継承し、必要な箇所だけ自分でオーバーライドして作ります。Inline項目の追加ここまでの例では、QuestionとChoiceを追加したい場合以下の手順を踏んでました。元になるQuestionを作成する。QuestionをChoiceの追加ページで選択する。ChoiceでいちいちQuestionを選択するのは面倒です。そこで便利なのがInlineFormです。InlineFormを使えば、リレーション元のオブジェクト(Question)とリレーション先のオブジェクト(Choice)を同時に作成できます。adminサイトでは、InlineAdminというInline表示用のクラスが用意されています。QuestionAdmin)admin.site.register(Choice)ChoiceInline、QuestionAdminの定義を追加します。Questionを登録する際の第2引数にQuestionAdminを渡すように修正します。3admin.StackedInlineは、Stacked形式(積み上げ型)のInlineを作成するためのベースクラスです。対象となるモデル(この場合はChoice)と表示数(extra=3)を設定します。他にも最大数、削除可能かどうかなどを設定できます。[ChoiceInline]admin.ModelAdminは管理サイトでのモデルの振る舞いをカスタマイズするためのクラスです。inlinesを設定し、オブジェクトの追加、編集時の振る舞いを変更しています。2管理サイトのQuestionの追加ページ(もしくは編集ページ)を開くと、Choicesを同時に編集できるようになっているのが確認できます。表示のカスタマイズ一覧の属性を増やしてみます。1表示を変えるにはadmin.ModelAdminを継承したクラス(QuestionAdmin)にlist_displayを設定します。'pub_date')2全てのモデルはdjangoが自動的に主キーを付けてくれます。これも表示してみます。'pub_date')引数なしメソッドを表示するカスタマイズlist_displayには、フィールドの他にも引数なしのメソッドを設定することができます。1以下のコードは、Questionモデルに質問が1日以内に公開されたものか確認するwas_published_recentlyメソッドを追加しています。(migrateは必要ありません。False)を返します。以下の条件が真(公開日が1日以内)の場合はTrue、1日を超過した場合はFalseをreturnで返します。datetime.timedelta(days=1)」は、現在から1日前の日付を表します。2次にlist_displayにこのメソッドを追加します。'was_published_recently')以下のようにwas_published_recently属性が追加されます。表示・オーダ条件のカスタマイズlist_displayの対象がメソッドの場合、メソッドに属性を追加することで表示の変更やオーダ条件の設定が可能です。1以下のように、admin_order_field、boolean、short_descriptionを設定します。recently?'...以下のような表示に変わります。admin_order_fieldは、並び替えをする時にどのフィールドを見るかを設定しています。(この例では、pub_dateフィールドで並び替えています。)この属性を設定すると、テーブルのヘッダをクリックして並び替えができるようになります。最後にフィルターと検索を追加します。1以下のようにQuestionAdminにプロパティを設定します。['question_text']以下のような表示に変わります。次回は、ルーティングの設定をして実際にページにコンテンツを表示してみます。