11
votes

Django Admin Recherche: Comment remplacer le gestionnaire par défaut?

Je souhaite personnaliser la manière dont les requêtes de recherche sur la recherche_fields.

Y a-t-il un moyen de le faire sans piratage profondément dans le code Django ou de créer une vue totalement indépendante?

Par exemple, je voudrais renvoyer l'union du requête des requêtes pour chacun des éléments du QueryString.split (). Ainsi, la recherche de "Bar Apple" retournerait des résultats avec Apple ou Barre, contrairement à la recherche par défaut qui applique un opérateur et un opérateur.


2 commentaires

Veuillez élaborer quel comportement voudriez-vous réaliser. Fournir parfaitement un exemple.


J'ai mis à jour ma réponse, vous pouvez le lire et éditer, puis essayer


3 Réponses :


0
votes

Vous pouvez ajouter un Modeladmin Méthode: xxx

Vous avez une demande ici, la plupart des éléments peuvent être afficher dépendants, y compris les paramètres d'URL, les cookies, sessions, etc.


0 commentaires

13
votes

Il est très facile de le faire dans Django 1.6

MODERADMIN.GET_SEARCH_RESULTS (Demande, QuerySet, Search_term) Nouveau dans Django 1.6. P>

import operator
# from django.utils.six.moves import reduce  # if Python 3
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 = reduce(operator.or_, [Q(**{c:v}) for c in search_columns for v in search_term_list])

        queryset = self.model.objects.filter(query_condition)
        # NOTICE, if you want to use the query before
        # queryset = queryset.filter(query_condition)
        return queryset, use_distinct


2 commentaires

Ceci a une vulnérabilité d'exécution de code à distance. Il n'est pas nécessaire d'utiliser EVAL pour construire les objets Q.


@Gavinwahl eval a été supprimé via opérateur.or _ et réduire , acclamations



1
votes

J'ai donc utilisé le code de la réponse de Weizhongtu et j'ai trouvé une erreur non si évidente dedans. Lorsque nous essayons d'utiliser à la fois le filtrage et la recherche avec ce code, le filtrage est ombré par cette ligne:

QuerySet = Self.Model.ObjectS.Filter (Eval (Query_Condition)) < P> Il est important d'utiliser uniquement les résultats précédents. Donc, vous ne devez jamais utiliser self.model.Objects pour obtenir le requérant, mais seulement filtrer le requérant elle-même. Comme ceci: xxx


0 commentaires