2011-02-19 192 views
1

這裏是我的一個學校項目 http://dpaste.com/434311/過濾的過濾器在Django管理

的代碼工作正常,studentadmin列表頁上的代碼,我得到的類 這是很好的過濾器,但你可以看到我的項目是多租戶所以在濾波器 區域我想只顯示類學校當前用戶 登錄(追蹤直通會議),但現在我可以看到所有學校

所以我所有 類的列表想替換這條線

list_filter = ['xclass'] 

的東西,如

list_filter = Class.objects.filter(school=request.session['school_id']) 

我該怎麼辦呢?

+1

後打大量的路障我想通了,我用錯了軌道...掌握Django的人應該 1)先學python 2)然後學習django 3)然後使用自己的HTML 4)然後再學無界形式 5進行手動形式),那麼有界形式 6)然後多種形式 7),然後去Django的管理 Django的自動管理是偉大的工具,但如果你會感到興奮,並直接跳上它,你將無法自定義它,你會像我一樣卡住。 現在我跟着上面提到的曲目,感覺好多了。 –

+0

我補充說,很多人選擇Django作爲其'管理'功能......然後意識到他們不能使用它! – Don

+0

鏈接不起作用。請僅發佈相關代碼。 –

回答

1

我已經遇到過這個問題多次。不幸的是,你將需要寫一個自定義的,無證的FilterSpec

Custom Filter in Django Admin on Django 1.3 or below

它正在對這樣應該很快就在這裏工作...
http://code.djangoproject.com/ticket/5833


另一種方法是用只有那些從學校ID修改基礎queryset的列表頁。 http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.queryset

def queryset(self, request): 
    qs = super(MyModelAdmin, self).queryset(request) 
    return qs.filter(xclass__school__id=request.session['school_id']) 
+0

謝謝@Yuji,我會研究自定義過濾器,您提供的鏈接。 BTW,你的查詢集提供的備用沒有任何差別,因爲我已經在59行這樣做,看到我的代碼 QS = self.model._default_manager.filter(學校=學校ID) –

+0

順便說一句,[狀態改變從分配到關閉,分辨率設置爲固定](http://code.djangoproject.com/ticket/5833#comment:126)。 – Paolo

2

從1.4版3月23日發佈,2012你可以使用官方django.contrib.admin.SimpleListFilter

這裏是用來只有列表中的活動公司的過濾器代碼示例:

class ActiveCompaniesFilter(SimpleListFilter): 
    # Human-readable title which will be displayed in the 
    # right admin sidebar just above the filter options. 
    title = _('active companies') 

    # Parameter for the filter that will be used in the URL query. 
    parameter_name = 'project__company' 

    def lookups(self, request, model_admin): 
     """ 
     Returns a list of tuples. The first element in each 
     tuple is the coded value for the option that will 
     appear in the URL query. The second element is the 
     human-readable name for the option that will appear 
     in the right sidebar. 
     """ 
     lookup_list = Company.objects.active().values_list('id', 'name').distinct() 
     # 'objects.active' is a custom Company manager and is 
     # equivalent to filter 'objects.filter(status=100)' 
     return lookup_list 

    def queryset(self, request, queryset): 
     """ 
     Returns the filtered queryset based on the value 
     provided in the query string and retrievable via 
     `self.value()`. 
     """ 
     # Compare the requested value (either '80s' or 'other') 
     # to decide how to filter the queryset. 
     if self.value(): 
      return queryset.filter(project__company=self.value())