2009-12-28 456 views
2

管理員操作可以對列表頁面中的選定對象起作用。 是否可以對所有過濾的對象執行操作?django管理員對所有過濾對象的操作

例如,如果管理員搜索以「T恤」,這跟400級的產品結果開始,並希望通過提高10%,所有這些價格的產品名稱。 如果管理員一次只能修改一頁結果,則需要付出很大的努力。

感謝

回答

2

的自定義操作都應該是對一組選定對象的使用,所以我不認爲這是做你想要什麼的標準方法。

但是我想我有可能爲你工作一劈...(意思是:您自擔風險使用,它是未經測試)

在你動功能的request.GET將包含在使用Q參數管理員搜索。所以,如果你在搜索中鍵入「T恤」,你應該看到request.GET看起來類似:

<QueryDict: {u'q': [u'T-Shirt']}>

你可以完全不顧你的自定義操作函數接收查詢參數並建立自己的查詢集基於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的代碼,查看如何列出要刪除的對象的示例。它應該指向正確的方向。

注意:用戶仍然必須在管​​理頁面中選擇一些內容,否則操作函數將永遠不會被調用。

2

這是一個更通用的解決方案,沒有經過全面測試(和其漂亮的幼稚),所以它可能會用異樣的過濾器破裂。對於我來說,可以使用日期過濾器,外鍵過濾器,布爾過濾器。

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)