J'ai donc trouvé un moyen d'utiliser _unaccent
et _search
ensemble dans les filtres Django, mais j'essaie de trouver un moyen de l'implémenter correctement dans la barre de recherche dans les pages d'administration. Jusqu'à présent, j'ai le code suivant, mais comme je ne l'ai pas fait correctement, les paramètres d'administration tels que search_fields = []
ne s'appliquent pas correctement. J'apprécierais que quelqu'un puisse m'aider à fusionner ma solution avec l'implémentation originale de Django.Django _unaccent et _search in Admin
fonction admin.ModelAdmin
être écrasé:
def get_search_results(self, request, queryset, search_term):
"""
Returns a tuple containing a queryset to implement the search,
and a boolean indicating if the results may contain duplicates.
"""
# Apply keyword searches.
def construct_search(field_name):
if field_name.startswith('^'):
return "%s__istartswith" % field_name[1:]
elif field_name.startswith('='):
return "%s__iexact" % field_name[1:]
elif field_name.startswith('@'):
return "%s__search" % field_name[1:]
else:
return "%s__icontains" % field_name
use_distinct = False
search_fields = self.get_search_fields(request)
if search_fields and search_term:
orm_lookups = [construct_search(str(search_field))
for search_field in search_fields]
for bit in search_term.split():
or_queries = [models.Q(**{orm_lookup: bit})
for orm_lookup in orm_lookups]
queryset = queryset.filter(reduce(operator.or_, or_queries))
if not use_distinct:
for search_spec in orm_lookups:
if lookup_needs_distinct(self.opts, search_spec):
use_distinct = True
break
return queryset, use_distinct
Mon code:
def get_search_results(self, request, queryset, search_term): # TODO: Make this more professionally implemented (proper overrides)
""" Overrides default search completely to incorporate __search and __unaccent lookups """
use_distinct = False
if search_term: # Note: "if" condition necessary to show ALL results in admin if not search_term is specified (otherwise shows 0 results)
queryset = queryset.annotate(unaccent_title=SearchVector('title', config='english_unaccent')).filter(unaccent_title=SearchQuery(search_term, config='english_unaccent'))
return queryset, use_distinct
Django: 1.11.5
Python: 3.6.2
A travaillé parfaitement - merci! – Hybrid