管理者アクションは、リストページで選択したオブジェクトに作用できます。フィルタリングされたすべてのオブジェクトに作用することは可能ですか?
たとえば、管理者が「Tシャツ」で始まる商品名を検索した場合、400の商品が表示され、すべての商品の価格を10%引き上げたいとします。管理者が一度に1ページの結果しか変更できない場合は、多大な労力が必要になります。
ありがとう
これはより一般的な解決策であり、完全にテストされていない (そしてかなり素朴な) ため、奇妙なフィルターで壊れる可能性があります。私にとっては、日付フィルター、外部キーフィルター、ブールフィルターで動作します。
def publish(modeladmin,request,queryset):
kwargs = {}
for filter,arg in request.GET.items():
kwargs.update({filter:arg})
queryset = queryset.filter(**kwargs)
queryset.update(published=True)
カスタム アクションは、選択したオブジェクトのグループに対して使用することになっているため、標準的な方法で目的を達成できるとは思いません。
しかし、私はあなたのために働くかもしれないハックを持っていると思います...(意味:自己責任で使用し、テストされていません)
アクション関数にrequest.GET
は、管理者検索で使用される q パラメータが含まれます。したがって、検索で「T シャツ」と入力すると、次のrequest.GET
ように表示されます。
<QueryDict: {u'q': [u'T-Shirt']}>
カスタム アクション関数が受け取る querystring パラメーターを完全に無視して、そのrequest.GET
'sq パラメーターに基づいて独自のクエリセットを構築できます。何かのようなもの:
def increase_price_10_percent(modeladmin, request, queryset):
if request.GET['q'] is None:
# Add some error handling
queryset=Product.objects.filter(name__contains=request.GET['q'])
# Your code to increase price in 10%
increase_price_10_percent.short_description = "Increases price 10% for all products in the search result"
q が空のリクエストは禁止します。そして、あなたが読んだところでname__contains
は、製品オブジェクトの管理者のために作成したフィルターを模倣する必要があります (したがって、検索で名前フィールドのみを見ているname__contains
場合は十分かもしれません; 名前と説明を見ている場合は、さらにここでもアクション関数の複雑なフィルター)。
また、おそらく、どのモデルが影響を受けるかを示す中間ページを追加し、ユーザーに「自分が何をしているのかを本当に知っている」確認ボタンをクリックさせます。django.contrib.admin.actions
削除されるオブジェクトを一覧表示する方法の例については、コードを参照してください。それはあなたを正しい方向に向けるはずです。
注:ユーザーは引き続き管理ページで何かを選択する必要があります。そうしないと、アクション関数が呼び出されません。