2014-01-15 1 views
0

Я пытаюсь использовать ту же поисковую систему, что и Django на странице администратора, чтобы показывать результаты в моих пользовательских представлениях.Использование поисковой системы Django Admin в моих собственных представлениях

Я нашел this website, который рекомендует использовать следующий код:

from django.db.models import Q 
from django.db.models.query import QuerySet 
import operator 

def django_admin_keyword_search(model, keywords, base_qs=None): 
    """Search according to fields defined in Admin's search_fields""" 
    if not keywords: 
     return [] 
    fields = model._meta.admin.search_fields 

    qs = QuerySet(model) 

    for keyword in keywords: 
     or_queries = [Q(**{'%s__icontains' % field: keyword}) for field in fields] 
     if base_qs is None: 
      other_qs = QuerySet(model) 
     else: 
      other_qs = base_qs 
     if qs._select_related: 
      other_qs = other_qs.select_related() 
     other_qs = other_qs.filter(reduce(operator.or_, or_queries)) 
     qs = qs & other_qs 

    return qs 

def do_keyword_search(model, query, base_qs=None): 
    return django_admin_keyword_search(model, query.split(' '), 
             base_qs=base_qs) 

, но я не в состоянии работать, что, не получая Attribute Error (объект «Параметры» не имеет атрибута «администратора») на этот кусок кода: fields = model._meta.admin.search_fields

EDIT: Что я делаю неправильно с помощью администратора поисковой системы по умолчанию?

Это другой способ использовать поисковую систему администратора по умолчанию?

+2

Обратите внимание на дату на эту ссылку: ** 7 лет назад **. Это хорошо до Django 1.0, и администратор был совсем другим. –

ответ

0

Мне удалось создать свой собственный общий поиск, который работает как поиск администратора. Класс выглядит следующим образом:

from django.db.models import Q 
from django.db.models.query import QuerySet 
import operator 

def django_admin_keyword_search(model, keywords, search_fields): 
    """Search according to fields defined in Admin's search_fields""" 
    all_queries = None 

    for keyword in keywords.split(' '): #breaks query_string into 'Foo' and 'Bar' 
     keyword_query = None 

     for field in search_fields: 
      each_query = Q(**{field+'__icontains':keyword}) 

      if not keyword_query: 
       keyword_query = each_query 
      else: 
       keyword_query = keyword_query | each_query 

     if not all_queries: 
      all_queries = keyword_query 
     else: 
      all_queries = all_queries & keyword_query 

    result_set = model.objects.filter(all_queries).distinct() 

    return result_set 

Наслаждайтесь!

Смежные вопросы