2010-08-21 36 views
10

Tôi muốn tùy chỉnh cách truy vấn tìm kiếm trên các search_fields.Tìm kiếm quản trị Django: cách ghi đè trình xử lý mặc định?

Có cách nào để thực hiện điều đó mà không cần xâm nhập sâu vào mã Django hoặc tạo một chế độ xem hoàn toàn độc lập không? Ví dụ:

Ví dụ, tôi muốn trả về kết hợp các queryset cho mỗi mục của querystring.split(). Vì vậy, tìm kiếm "thanh táo" sẽ trả về kết quả bằng thanh OR HOẶC BẮT ĐẦU, không giống như tìm kiếm mặc định áp dụng toán tử AND.

+1

Hãy giải thích chính xác hành vi nào bạn muốn đạt được. Lý tưởng nhất là cung cấp một ví dụ. –

+0

Tôi vừa thêm một ví dụ –

+0

Tôi đã cập nhật câu trả lời của mình, bạn có thể đọc và chỉnh sửa, sau đó thử – WeizhongTu

Trả lời

0

bạn có thể thêm một phương pháp 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 

bạn có một yêu cầu ở đây, vì vậy hầu hết các công cụ có thể xem phụ thuộc, bao gồm các thông số url, cookies, phiên, vv

9

Nó rất dễ thực hiện việc này trong django 1.6

ModelAdmin.get_search_results(request, queryset, search_term) Mới trong 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

Vì vậy, tôi đã sử dụng mã từ câu trả lời của WeizhongTu và tìm thấy lỗi không rõ ràng trong đó. Khi chúng ta cố gắng sử dụng cả lọc và tìm kiếm với mã này, lọc bị che bởi dòng này:

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

Điều quan trọng là sử dụng các kết quả trước đó CHỈ. Vì vậy, bạn không bao giờ được sử dụng self.model.objects để có được bộ truy vấn, nhưng chỉ lọc chính bộ truy vấn đó. Như thế này:

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 
Các vấn đề liên quan