EDIT: j'ai réussi à inclure une barre de recherche en utilisant 'DjangoFilter'
Je voudrais ajouter une barre de recherche à mon modèle dans Django
Je voudrais inclure une zone de recherche au-dessus d'une liste d'articles afin que les utilisateurs puissent rechercher dans les données
Quand j'entre quelque chose dans la barre, rien ne se passe ...
ci-dessous mon code
Merci pour l'aide à l'avance Dans la page HTML
{% for article in articles %}
<a> {{article.feeder}} </a>
{% endfor %}
Dans views.py
def article_overview(request):
search_term = ''
if 'search' in request.GET:
search_term = request.GET['search']
articles = Article.objects.all().filter(feeder__icontains=search_term)
articles = Article.objects.all()
return render(request, 'overviews/overview.html', {'articles' : articles, 'search_term': search_term })
dans overview.html (simplifié):
XXX
4 Réponses :
En supposant que vos articles soient enregistrés dans votre base de données, ce que vous pouvez faire est d'avoir une liste de données pour votre entrée, utilisez AJAX pour préremplir la liste de données avec les articles de votre base de données afin que vous ayez une sorte de liste déroulante / recherche à saisie semi-automatique boîte.
Il existe un excellent tutoriel de Teamtreehouse.com pour cette implémentation. Voici le lien .
Vous attribuez une variable d'article à deux endroits, vous écrasez donc le premier. Renommez la variable article à l'intérieur de l'instruction if et transmettez-la au modèle
if 'search' in request.GET:
search_term = request.GET['search']
search_result = Article.objects.all().filter(feeder__icontains=search_term)
articles = Article.objects.all()
return render(request, 'overviews/overview.html', {'articles' : articles, 'search_result': search_result })
ne fonctionne toujours pas .. dois-je modifier mes balises de modèle?
Bien sûr, vous devez rendre l'ensemble de requêtes de résultats. C'est aussi simple que: {% for result in search_result%} {{result.fieldname}} {% endfor}} P.S. notez que 'fieldname' doit être le nom de votre champ de modèle.
salut Renato. ok mais j'ai déjà eu des balises de modèle pour afficher la liste entière? cf via articles .. comment combiner?
Ce sont deux ensembles de requêtes distincts. Les fusionner n'aurait pas de sens car dans les articles, vous récupérez déjà tous les objets et en les fusionnant, vous obtiendrez des doublons dans votre liste.
en html, remplacez {{articles.feeder}} par {{item.feeder}}
Oops. était la seule erreur de mon côté en écrivant ma question ici. ne résout pas le problème dans mon code réel.
Dans views.py,
{% for result in all_search_results %}
{{ .....add according to your model }}
{% empty %}
add something to show no results
{% endfor %}
Dans votre modèle de requête de recherche,
<form class="add_your_class" method="GET" action="" >
<input class="add_your_class" type="search" name="search">
<button class="add_your_class" type="submit"> Search </button>
</form>
Dans les modèles, vous pouvez l'ajouter comme pour afficher résultats
class SearchView(ListView):
model = Article
template_name = 'search.html'
context_object_name = 'all_search_results'
def get_queryset(self):
result = super(SearchView, self).get_queryset()
query = self.request.GET.get('search')
if query:
postresult = Article.objects.filter(title__contains=query)
result = postresult
else:
result = None
return result
Quelque chose à ajouter dans la vue URL?
vue URL? Si vous demandez le chemin de l'url, vous n'en avez pas besoin car vous recherchez la requête. Comme vous avez de nombreuses réponses sur ce message, marquez comme correcte la réponse qui vous convient. Cela aidera quelqu'un d'autre qui le recherche.
Salut Bidhan. aucun n'a fonctionné. Mais j'ai mis une modification en haut expliquant que j'ai réussi à effacer le point en utilisant django-filter. Meilleur,
Mon exemple a fonctionné dans mon cas: modèle de base:
path('results/', ecomm_views.SearchView.as_view(), name='search'),
modèle de recherche:
class SearchView(ListView):
model = Products
template_name = 'ecomm/search.html'
context_object_name = 'all_search_results'
def get_queryset(self):
result = super(SearchView, self).get_queryset()
query = self.request.GET.get('search')
if query:
postresult = Products.objects.filter(title__contains=query)
result = postresult
else:
result = None
return result
la vue:
{% extends "ecomm/base.html" %}
{% block content %}
{% for product in all_search_results %}
<h3>{{product.title}}</h3>
<p>{{product.description}}</p>
<img src="{{ product.picture.url }}">
{% empty %}
<h2>No results found</h2>
{% endfor %}
{% endblock %}
l'url:
form class="form-inline my-2 my-lg-0" method="GET" action="{% url 'ecomm:search' %}" >
<input class="form-control mr-sm-2" type="search" name="search">
<button class="btn btn btn-outline-info my-2 my-sm-0" type="submit"> Search </button>
</form>
votre clause
ifne fait rien car vous remplacez toujours lesarticlesparArticle.objects.all (). Vérifiez le flux de votre code ...Merci. Cependant, cela ne fonctionne toujours pas. dois-je également inclure le search_term dans mes balises de modèle?
Alors, qu'avez-vous changé? Vous avez ajouté
else? Et quand vous dites «rien ne se passe», que voulez-vous dire exactement? Vraiment rien ne se passe?la recherche n'est pas "exécutée". rien ne se passe dans le navigateur Web. J'ai corrigé le nom de la variable comme vous l'avez suggéré
Je n'ai pas suggéré de changer de nom. Je viens de dire que votre ligne
articles = Article.objects.all ()est toujours exécutée afin que votre vue montre toujours tous les articles quelle que soit la recherche. Vous pouvez supprimer entièrement la clauseif, c'est ce que fait votre code.Rien ne se passe dans le navigateur? La page n'est donc pas actualisée et le champ de recherche n'est pas vidé?
Salut dirkgroten. le champ de saisie de recherche dans la barre d'url n'est pas vidé non. Cela reste comme ça (exemple:? Search = abc)
Déplacez d'abord
articles = Article.objects.all ()au-dessus de la clauseif. Vérifiez ensuite dans les outils de développement de votre navigateur si le formulaire est soumis en cliquant sur le bouton de recherche. Ou définissez un point d'arrêt dans votre méthode pythongetet vérifiez ce qui est soumis."EDIT: j'ai réussi à inclure une barre de recherche en utilisant 'DjangoFilter'" Pouvez-vous mieux expliquer s'il vous plaît? Vous pouvez répondre à votre propre question et montrer à la communauté comment vous réussissez. Merci