Integreer de zoekfunctie in uw Django-applicatie met behulp van deze stapsgewijze handleiding.
Door een zoekfunctie aan uw webtoepassing toe te voegen, kunnen uw gebruikers er gemakkelijk doorheen navigeren door te zoeken naar wat ze willen. Django biedt ingebouwde ondersteuning voor het bouwen van een zoekfunctie door zijn krachtige ORM- en querytools te gebruiken. Met Django kunt u verschillende soorten zoekopdrachten implementeren, waaronder zoeken op trefwoorden, eenvoudige zoekopdrachten en geavanceerde zoekopdrachten met filters.
Zoekfunctionaliteit implementeren in Django
Met Django kunt u verschillende soorten zoekopdrachten implementeren met zijn ingebouwde methoden en functies. U kunt een eenvoudige zoekopdracht op trefwoord of een geavanceerde zoekopdracht uitvoeren op basis van uw gebruiksscenario. U moet een geavanceerd zoeken uitvoeren als u een complexe toepassing heeft, zoals een e-commerce website, terwijl een eenvoudig zoeken op trefwoord geschikt is voor minder complexe projecten.
De code die in dit artikel wordt gebruikt, is te vinden op GitHub en is gratis voor u om te gebruiken onder de MIT-licentie.
Implementeer een eenvoudig zoeken op trefwoorden in Django
Om een eenvoudige zoekfunctie te maken, moet u beginnen met het bouwen van uw zoekbalk. U kunt uw zoekbalk in uw navigatiebalk bouwen. Bootstrap biedt een kant-en-klare navigatiebalk met een zoekbalk, en u kunt eenvoudig integreer Bootstrap en zijn componenten in uw Django-project. Maak uw zoekbalk in een HTML-bestand, stel de formuliermethode in op NA, en geef het invoerveld a naam attribuut als volgt:
<formulierklas="d-flex"rol="zoekopdracht"methode="NA">
{% csrf_token %}
<invoer
class="form-control me-NN"
typ="zoeken"
placeholder="Zoeken"
name="zoekvraag"
vereist aria-label="Zoeken"
>
<knopklas="btn btn-overzicht-succes"type="indienen">Zoekopdrachtknop>
formulier>
In de bovenstaande code is de naam van het invoerveld zoekopdracht. Het formulier maakt gebruik van Django's CSRF-token naar CSRF-aanvallen voorkomen. Volg deze stappen om uw zoekbalk te laten werken.
Maak een weergave voor de zoekopdracht
- Open je weergaven.py bestand en importeer uw model uit het modellen.py bestand:
van .modellen importeren Modelnaam
- Maak een weergavefunctie voor de zoekfunctie:
defzoekfunctie(verzoek):
# Controleer of het verzoek een postverzoek is.
als aanvraag.methode == 'NA':
# Haal de zoekopdracht op die door de gebruiker is ingevoerd
zoekvraag = verzoek. NA['zoekopdracht']
# Filter uw model op de zoekopdracht
posts = Model.objects.filter (fieldName__contains=search_query)
opbrengst renderen (verzoek, 'app/sjabloon_naam.html', {'vraag':zoekopdracht, 'berichten':berichten})
anders:
opbrengst renderen (verzoek, 'app/sjabloon_naam.html',{})
De bovenstaande functie controleert eerst of de client een NA verzoek. Als de controle slaagt, wordt de waarde van de zoekopdracht van de gebruiker als volgt opgehaald:
zoekvraag = verzoek. NA['zoekopdracht']
In aanvraag. POST['zoekopdracht'], 'zoekopdracht' moet worden vervangen door de naam van het invoerveld van uw zoekbalk.
Na het ophalen van de waarde van de zoekopdracht van de gebruiker, filtert de functie het model ermee door de __bevat methode. De __bevat methode is niet hoofdlettergevoelig. Om deze methode te gebruiken, moet u dit formaat volgen:
veldNaam__bevat
Als u bijvoorbeeld wilt dat uw gebruikers zoeken op basis van een modelveld genaamd naam, zou je je code moeten aanpassen om er zo uit te zien:
naam__contains=zoekvraag
Ten slotte geeft de functie een sjabloon weer en geeft de zoekopdracht en het gefilterde model door als context.
Als de methode van het formulier echter geen NA verzoek, geeft de functie een sjabloon weer met een leeg woordenboek en verwerkt de zoekopdracht niet.
Maak een sjabloon voor het zoekresultaat
- Maak een HTML-bestand om uw zoekresultaten terug te sturen naar de clientzijde.
- Geef het zoekresultaat op de pagina weer zodat de gebruiker het kan zien. De code in uw HTML-bestand zou er als volgt uit moeten zien:
{% als vraag %}
<div>
<div>
lus door de zoekopdracht
{% voor bericht in berichten %}
<div>
zoekvraag terug
<P>{{post.title}}P>
div>
{% endfor %}
div>
div>
{% anders %}
een bericht retourneren als de gebruiker geen zoekopdracht invoert
<h1>Voer een zoekopdracht inh1>
{% stop als %}
Het bovenstaande HTML-sjabloon controleert of de gebruiker een zoekopdracht invoert in de zoekbalk. Als de gebruiker een zoekopdracht invoert, a for loop doorloopt de zoekresultaten en geeft ze terug aan de gebruiker. Als er geen zoekopdracht is, wordt er een bericht weergegeven waarin de gebruiker een zoekopdracht kan invoeren. Een geval waarin er mogelijk geen zoekopdracht is, is als uw gebruiker rechtstreeks naar de URL gaat zonder de zoekbalk in te vullen, d.w.z. uw gebruiker voert een URL in zoals mijnwebsite.com/zoeken rechtstreeks in de browser. U moet ervoor zorgen dat u gebruikt Django's sjabloonovererving in uw HTML-bestand.
- Pas uw HTML-code aan om een foutmelding te geven als er geen zoekresultaat is.
{% als vraag %}
<div>
<div>
controleer of er een resultaat in de database staat
{% als berichten %}
loop door de zoekopdracht als er een resultaat is
{% voor bericht in berichten %}
<div>
zoekvraag terug
<P>{{post.title}}P>
div>
{% endfor %}
stuur een bericht als er geen resultaten zijn gevonden.
{% anders %}
<h3>Geen zoekresultaten gevondenh3>
{% stop als %}
div>
div>
{% anders %}
<h1>Voer een zoekopdracht inh1>
{% stop als %}
De nieuwe HTML-sjabloon zorgt voor een betere gebruikerservaring. Het introduceert een voorwaardelijke verklaring om te controleren of een zoekresultaat beschikbaar is in de database. Als dat zo is, wordt het zoekresultaat weergegeven; anders stuurt het de gebruiker een foutmelding.
Configureer uw URL-patronen
- Als je dit nog niet hebt gedaan, maak dan een URL.py bestand in uw app-directory.
- In uw URL.py, bestand maak een URL-patroon voor uw zoekpagina:
van django.urls importeren pad
van. importeren keer bekeken
urlpatronen = [
pad('zoekopdracht/', views.search_feature, naam='zoekweergave'),
]
Bovenstaand programma importeert eerst het pad functie en de keer bekeken bestand met betrekking tot de app. Vervolgens maakt het een pad met de naam zoek-weergave voor de zoekpagina.
- Voeg een formulieractie toe aan uw zoekbalk. De actie-URL moet verwijzen naar het URL-pad dat is toegewezen aan de zoekweergave. In dit geval verwijst het formulier naar zoek-weergave.
<formulierklas="d-flex"rol="zoekopdracht"methode="NA"actie="{% url 'zoekweergave' %}">
<invoer
class="form-control me-NN"
typ="zoeken"
placeholder="Zoek naar iets"
name="zoekvraag"
vereist aria-label="Zoeken"
>
<knopklas="btn btn-overzicht-succes"type="indienen">Zoekopdrachtknop>
formulier>
Zonder een formulieractie die naar uw zoek-URL-pad verwijst, werkt uw zoekfunctie niet. Onthoud dat uw zoek-URL-pad moet verwijzen naar de Django-weergave die de logica van uw zoekfunctie afhandelt.
Maak een zoekfunctie voor meerdere modelvelden
Als u de gebruikerservaring van uw web-app wilt verbeteren, kunt u uw gebruikers laten zoeken op meer dan één veld in uw model. In een blog-app wilt u bijvoorbeeld dat uw gebruiker zoekt op basis van posttitels of auteursnamen.
Om deze functie te implementeren, moet u de Q object geleverd door Django. Je moet de Q voorwerp in je weergaven.py bestand als volgt:
van django.db.models importeren Q
Na het importeren Q, moet u uw weergavefunctie als volgt wijzigen:
defzoek_post(verzoek):
als aanvraag.methode == 'NA':
zoekvraag = verzoek. NA['zoekopdracht']
posts = Post.objects.filter (Q(title__icontains=search_query) | Q(author__icontains=search_query))
opbrengst renderen (verzoek, 'app/sjabloon_naam.html', {'vraag':zoekopdracht, 'berichten':berichten})
anders:
opbrengst renderen (verzoek, 'app/sjabloon_naam.html',{})
In het programma hierboven, de posten variabele filtert het model op de titel van het bericht of de naam van de auteur. De functie maakt gebruik van de OF operator - in dit geval een pijpsymbool - om het filter uit te voeren.
Gebruikerservaring verbeteren met een zoekfunctie
Een zoekfunctie in uw webapplicatie verbetert effectief de gebruikerservaring en algehele bruikbaarheid. Met Django hoeft u alleen gebruik te maken van de ingebouwde functionaliteiten om uw zoekfunctie te laten werken, wat aanzienlijke voordelen oplevert voor u en uw gebruikers.