4
votes

Rechercher Bar à Django

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


9 commentaires

votre clause if ne fait rien car vous remplacez toujours les articles par Article.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 clause if , 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 clause if . 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 python get et 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


4 Réponses :


0
votes

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 .


0 commentaires

0
votes

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 })    


6 commentaires

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.



4
votes

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


3 commentaires

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,



0
votes

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>


0 commentaires