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
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ụ. –
Tôi vừa thêm một ví dụ –
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