2014-12-19 60 views
3

當我覆蓋get_search_results方法後,list_filter不起作用,但搜索字段按我的預期工作。如預期管理員列表過濾器和搜索結果

class NaruceniProduktiAdmin(admin.ModelAdmin): 
    search_fields = ('broj_narudbe',) 
    list_filter = ('date', 'status',) 
    list_display = (
     'naziv_produkta', 'datum', 'narudba_broj', 'boja', 'velicina', 'cijena', 'kolicina', 
     'ukupna_cijena','korisnik_link','status','source_link', 
    ) 
    actions = [dostupan, nedostupan, email_dostupan, placen, posalji_racun, poslan, isporucen, storniran, posalji_storno, ] 

    def get_search_results(self, request, queryset, search_term): 
     queryset, use_distinct = super(NaruceniProduktiAdmin, self).get_search_results(request, queryset, search_term) 

     try: 
      search_term_as_int = int(search_term) 
     except ValueError: 
      search_term_as_int=search_term.strip() 
      queryset |= self.model.objects.filter(korisnik__ime__icontains=search_term_as_int) 

      if not queryset: 
       queryset |= self.model.objects.filter(korisnik__prezime__icontains=search_term_as_int) 
     else: 
      queryset = self.model.objects.filter(broj_narudbe=search_term_as_int) 

     return queryset, use_distinct 

如果我刪除get_search_results,然後list_filter作品。我想保留它,因爲我希望搜索字段的工作方式符合我的期望,但我也希望列表篩選能像通常那樣工作。

有沒有一種方法可以將這兩種方法結合使用?爲什麼一個人會影響另一個呢?

enter image description here

+0

你是什麼意思「'list_filter'不工作」?怎麼了? – Anentropic

+0

當我點擊在Django管理員權限過濾日期..例如今天,ot過去7天沒有發生任何事情 – blaz1988

+0

任何人?主要問題是爲什麼get_search_results會影響list_filter的工作。Django是否對search_fields和list_filter使用了相同的方法get_search_results ..? – blaz1988

回答

2

變更列表視圖首先使濾波,然後將其給人過濾查詢集作爲參數傳遞給您的get_search_results功能。爲了使它正常工作,您應該使用queryset參數而不是self.model.objects

def get_search_results(self, request, queryset, search_term): 
    new_queryset, use_distinct = super(NaruceniProduktiAdmin, self).get_search_results(request, queryset, search_term) 

    try: 
     search_term_as_int = int(search_term) 
    except ValueError: 
     search_term_as_int=search_term.strip() 
     new_queryset |= queryset.filter(korisnik__ime__icontains=search_term_as_int) 

     if not new_queryset: 
      new_queryset |= queryset.filter(korisnik__prezime__icontains=search_term_as_int) 
    else: 
     new_queryset = queryset.filter(broj_narudbe=search_term_as_int) 

    return new_queryset, use_distinct