Python
Django

Djangoのraw_id_fieldsが変更権限を要求する問題(#11561)を回避するバッドノウハウ

More than 3 years have passed since last update.

DjangoのAdminSiteのraw_id_fieldsは
ポップアップウィンドウで候補検索して選択できるので、
選択肢がいっぱいあるときとか便利。

ただし、ポップアップウィンドウが
ModelAdminのchangelist_viewを呼んでるので
選びたいだけなのに、change permissionがないと怒られる。
(https://code.djangoproject.com/ticket/11561)

ModelAdmin内のchangelist_viewのメソッドを
コピーして(changelist_view_readonlyとか)変更機能のないviewを実装してもいいけど、
もうちょっと楽な方法を。

かなりバッドノウハウだけど、

django/contrib/options.py
ModelAdminクラスのchangelist_viewメソッド内

if not self.has_change_permission(request, None):
            raise PermissionDenied

をコメントアウトする。
そもそもchangelist_viewでは、permission持ってないと
テンプレート側でアクションボタンが表示されないので、
AdminSiteを使う管理者が自分だけとかならこれだけでOK。
ただし、非ブラウザ経由でcsrfトークン読んでPOSTリクエスト送ったら通りそう(未テスト)。
他に管理者がいたりして、セキュリティがザルでは困るときには
コメントアウトせずに、ifの条件式に

request.method=='POST'

とか、actionがある場合の条件を加えてみたりするのがいいかも。