2010-08-21 16 views
10

मैं जिस तरह खोज search_fields भर में प्रश्नों को अनुकूलित करना चाहते हैं।Django व्यवस्थापक खोज: डिफ़ॉल्ट हैंडलर को ओवरराइड कैसे करें?

वहाँ Django कोड में गहराई से हैकिंग या एक पूरी तरह से स्वतंत्र दृश्य बनाने के बिना यह करने के लिए कोई तरीका है?

उदाहरण के लिए, मैं querystring.split() के प्रत्येक आइटम के लिए क्वेरीसेट का संघ वापस करना चाहता हूं। ताकि "सेब बार" की खोज करने से किसी भी एंड्रॉइड पर लागू होने वाली डिफ़ॉल्ट खोज के विपरीत, किसी भी एप्पल या बार के साथ परिणाम वापस आ जाएंगे।

+1

कृपया विस्तृत करें कि आप वास्तव में क्या व्यवहार करना चाहते हैं। आदर्श रूप से एक उदाहरण प्रदान करते हैं। –

+0

मैंने अभी एक उदाहरण जोड़ा है –

+0

मैंने अपना जवाब अपडेट किया है, आप इसे पढ़ सकते हैं और संपादित कर सकते हैं, फिर कोशिश करें – WeizhongTu

उत्तर

0

आप एक ModelAdmin विधि जोड़ सकते हैं:

def queryset(self, request): 
    qs = super(MyModelAdmin, self).queryset(request) 
    # modify queryset here, eg. only user-assigned tasks 
    qs.filter(assigned__exact=request.user) 
    return qs 

आप एक अनुरोध यहाँ है, तो सामान के सबसे दृश्य निर्भर हो सकता है, url पैरामीटर, कुकीज़, सत्र आदि सहित

9

यह बहुत है Django 1.6

ModelAdmin.get_search_results(request, queryset, search_term) में यह करने के लिए नए Django 1.6 में आसान।

from django.db.models import Q 

class PersonAdmin(admin.ModelAdmin): 
    list_display = ('name', 'age') 
    search_fields = ('name',) 

    def get_search_results(self, request, queryset, search_term): 
     # search_term is what you input in admin site 
     # queryset is search results 
     queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term) 

     search_term_list = search_term.split(' ')#['apple','bar'] 
     # you can also use `self.search_fields` instead of following `search_columns` 
     search_columns = ('name','age','address') 
     #convert to Q(name='apple') | Q(name='bar') | Q(age='apple') | ... 
     query_condition = ' | '.join(['Q(%s="%s")'%(x,y) for x in search_term_list for y in search_columns]) 
     queryset = self.model.objects.filter(eval(query_condition)) 

     return queryset, use_distinct 
0

तो मैं वेज़होंगतु के उत्तर से कोड का उपयोग कर रहा हूं और इसमें एक स्पष्ट त्रुटि नहीं मिली है। जब हम दोनों को छानने का उपयोग करने के लिए इस कोड के साथ खोज का प्रयास करें और, छानने इस लाइन द्वारा आच्छादित है:

queryset = self.model.objects.filter(eval(query_condition))

यह केवल पिछले परिणामों का उपयोग करने के लिए महत्वपूर्ण है। तो आपको क्वेरीसेट प्राप्त करने के लिए कभी भी self.model.objects का उपयोग नहीं करना चाहिए, लेकिन केवल क्वेरीसेट को ही फ़िल्टर करें। इस तरह:

def get_search_results(self, request, queryset, search_term): 
    # search_term is what you input in admin site 
    # queryset is the list of objects passed to you 
    # by the previous functions, e. g. filtering 
    search_term_list = search_term.split(' ') #['apple','bar'] 
    search_columns = ('name','age','address') 
    # convert to Q(name='apple') | Q(name='bar') | Q(age='apple') | ... 
    query_condition = ' | '.join(['Q(%s="%s")'%(x,y) for x in search_term_list for y in search_columns]) 
    appended_queryset = queryset.filter(eval(query_condition)) 
    # queryset is search results 
    queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term) 
    queryset |= appended_queryset 
    return queryset, use_distinct 
संबंधित मुद्दे