技術ネタです。ハマったので備忘録的に記します。
Django という Python 製のウェブフレームワークで hdknr さんとゆっくりながら勉強兼ねてアプリケーションを作成しています。管理画面の機能がよくできており、現在管理画面を作成しているのですがハマりまくってました。
管理画面でユーザー(author)のフィルタ(list_filter)を使いたかったのですが、管理画面には表示されず。ユーザーフィールドは ForeignKey で外部テーブルから持ってきているのですが表示されませんでした。Django 公式ドキュメントを見ても対応しているはずなので表示されないのはおかしい! と思ってあれこれ悩んでいたのですが、単にデフォルトの admin 以外のユーザーがいなかっただけというオチ。ここでハマる人は余りいないんですかねぇ。ユーザー追加したらあっさりフィルタが表示されました。コードは以下になってます。
class NoteOptions(admin.ModelAdmin):
list_display = (‘id’,’author’,’text’,’writed_at’,’votes’,’status’,’selected_tags’)
date_hierarchy = ‘writed_at’
list_filter = (‘author’,’writed_at’,’status’,’tags’)
search_fields = [‘text’,’author__username’]
filter_horizontal = [‘tags’]
つづいてハマったのがやはり管理画面で search_fields です。author を検索したかったのですが、author を追加しても検索できず。こちらは公式ドキュメントを見たらあっさり答えが書いてありました。
フィールドは CharField や TextField のような何らかのテキストフィールドでなければなりません。 DB API の「リレーションを追跡する」表記を使えば、 ForeignKey を介したフィールドの指定も行えます:
search_fields = [‘foreign_key__related_fieldname’]
実際のコードは前述のものと同じです。”__”で繋げるんですね。
トライ&エラーを繰り返しつつドキュメントを当たったりなどして解決できました。時間はかかったけどその分理解もできました。身に着けることが第一目標なので時間かかったけど気にしない。Django はドキュメントがしっかりしているので助かります。
追記。
コードのインデントがされませんね。Syntax-Highlighter 辺りを入れたほうがいいかな。