Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

ajouter une fonction de recherche

+2 votes

J'essaye de creer une fonction 'recherche' pour mon application Django en m'aidant de : http://julienphalip.com/post/2825034077/adding-search-to-a-django-site-in-a-snap

j'ai modifie les fichiers suivants :

-polls/views.py,
-polls/urls.py
-mysite/urls.py

Ainsi que creer un repertoire templates comportant un fichier html dans mon repertoire polls.

le probleme c'est que je vois pas ou placer le bout de code propose, dans un fichier.py contenue dans mon appli polls ?

Si jamais quelqu'un a un tuto ou une doc permettant de mettre en place une fonction de recherche avec Django je suis pas contre !

demandé 17-Sep-2015 par YannMgl (170 points)

Quelle genre de fonction recherche ? Sur quels genre de champs en db ?

3 Réponses

+2 votes
 
Meilleure réponse

Il y a le célébrissime HayStack Modular Search For Django

pour aider, un cas concret de mise en pratique apres avoir lu la doc

répondu 17-Sep-2015 par foxmask (2,702 points)
sélectionné 18-Sep-2015 par YannMgl

Ouai mais je dois essayer si possible de ne pas l'utiliser dans un premier temps. J'ai trouve un truc pas mal du style :

import re

def normalizequery(querystring)
re.compile(r'[^\s";,.:]+').findall(query_string)

Et aussi ce bout de code

from django.db.models import Q

def getquery(querystring, searchfields):
query = None # Query to search for every search term
terms = normalize
query(querystring)
for term in terms:
or
query = None # Query to search for a given term in each field
for fieldname in searchfields:
q = Q(**{"%s__icontains" % fieldname: term})
if or
query is None:
orquery = q
else:
or
query = orquery | q
if query is None:
query = or
query
else:
query = query & or_query
return query

testing on whatever model

from camping.models import Service

qry = get_query('hello cruel world', ['name','description'])

print qry
(AND: (OR: ('nameicontains', 'hello'), ('descriptionicontains', 'hello')), (OR: ('nameicontains', 'cruel'), ('descript
ion
icontains', 'cruel')), (OR: ('nameicontains', 'world'), ('descriptionicontains', 'world')))

fe = Service.objects.filter(qry)

fe.query

Je suis un peu perdu, je sais pas ou placer le code...Sachant que pour l'instant je souhaite juste tester avec la console, j'ai pas besoin de template, veiw etc ...

0 votes

ça répond peut-être à ta question,

def search(request):
    q = request.GET.get("q")
    if q:
       # you may want to use `__istartswith' instead
       results = Customer.objects.filter(name__icontains=q)
    else:
       # you may want to return Customer.objects.none() instead
       results = Customer.objects.all()     

    context = dict(results=results, q=q)
    return render(request, "yourapp/search.html", context)

ps : Django ce n'est pas ma tasse de thé x)
pss : quelques liens ici et

répondu 17-Sep-2015 par boblinux (3,094 points)

Ouai je pensais faire un truc du genre mais ce que je comprends pas c'est comment je vais pouvoir recuperer la request que l'utilisateur va taper sur le site.

0 votes

Bon pour l'instant je laisse tomber les fichiers views.py, urls.py et le template je me restreint a une fonction que j'ai definie comme etant une commande personnalisee.

Je pense que moon explication est nulle donc voila un exemple d'utilisation de la fonction recherche:

Un utilisateur souhaite voir les etudes portant sur la diffusion du patient ayant le champ PatientID='14002' de la table Patient. Il va alloir rentrer:

search function : '14002 DIFFUSION'

Ma fonction doit alors chercher un champ egal a 14002 et un champ = DIFFUSION
Comme je capte pas trop l'exemple du site j'ai commence a faire ma propre fonction mais c'est ultra long etant donne que je dois chercher dans toutes les tables et tous les champs...

répondu 18-Sep-2015 par YannMgl (170 points)
...