Integrer søkefunksjonen i Django-applikasjonen din ved å bruke denne trinnvise veiledningen.

Ved å legge til en søkefunksjon i nettapplikasjonen din kan brukerne dine enkelt navigere i den ved å søke etter det de vil ha. Django gir innebygd støtte for å bygge en søkefunksjon ved å bruke sine kraftige ORM- og spørringsverktøy. Med Django kan du implementere ulike typer søk, inkludert søkeordsøk, enkle søk og avanserte søk med filtre.

Implementering av søkefunksjonalitet i Django

Django lar deg implementere ulike typer søk med sine innebygde metoder og funksjoner. Du kan implementere et enkelt nøkkelordsøk eller et avansert søk basert på ditt bruksområde. Du bør implementere et avansert søk hvis du har en kompleks applikasjon, for eksempel et e-handelsnettsted, mens et enkelt nøkkelordsøk passer for mindre komplekse prosjekter.

Koden som brukes i denne artikkelen finner du på GitHub og er gratis for deg å bruke under MIT-lisensen.

Implementer et enkelt nøkkelordsøk i Django

For å lage en enkel søkefunksjon, bør du begynne med å bygge søkefeltet. Du kan bygge søkefeltet i navigasjonsfeltet.

Støvelhempe gir en ferdig navbar med søkefelt, og du kan enkelt integrer Bootstrap og dets komponenter i Django-prosjektet ditt. Lag søkefeltet i en HTML-fil, sett skjemametoden til POST, og gi inntastingsfeltet en Navn attributt som dette:

<formklasse="d-flex"rolle="Søk"metode="POST">
 {% csrf_token %}
<input
class="form-control me-NN"
type="søk"
plassholder="Søk"
name="search_query"
obligatorisk aria-label="Søk"
 >
<knappklasse="btn btn-outline-suksess"type="sende inn">Søkknapp>
form>

I koden ovenfor er navnet på inndatafeltet søkeord. Skjemaet benytter seg av Djangos CSRF-token til forhindre CSRF-angrep. Følg disse trinnene for å få søkefeltet til å fungere.

Opprett en visning for søket

  • Åpne din views.py fil og importer modellen fra models.py fil:
fra .modeller import Modell navn
  • Opprett en visningsfunksjon for søkefunksjonen:
defsøkefunksjon(be om):
# Sjekk om forespørselen er en postforespørsel.
hvis request.method == 'POST':
# Hent søket angitt av brukeren
search_query = forespørsel. POST['søkeord']
# Filtrer modellen din etter søket
innlegg = Model.objects.filter (fieldName__contains=search_query)
komme tilbake gjengi (forespørsel, 'app/mal_name.html', {'spørsmål':søkeord, 'innlegg':posts})
ellers:
komme tilbake gjengi (forespørsel, 'app/mal_name.html',{})

Funksjonen ovenfor sjekker først om klienten sender en POST be om. Hvis kontrollen består, fortsetter den å hente verdien av brukerens søk slik:

search_query = forespørsel. POST['søkeord']

På forespørsel. POST['search_query'], 'søkeord' bør erstattes med navnet på søkefeltets inndatafelt.

Etter å ha hentet verdien av brukerens søk, filtrerer funksjonen modellen med den ved å bruke __inneholder metode. De __inneholder metoden skiller mellom store og små bokstaver. For å bruke denne metoden, bør du følge dette formatet:

feltnavn__ inneholder

For eksempel hvis du vil at brukerne skal søke basert på et modellfelt kalt Navn, bør du endre koden slik at den ser slik ut:

name__contains=search_query

Til slutt gjengir funksjonen en mal og sender søket og den filtrerte modellen som kontekst.

Imidlertid, hvis skjemaets metode ikke er en POST forespørsel, gjengir funksjonen en mal med en tom ordbok og behandler ikke søket.

Lag en mal for søkeresultatet

  • Opprett en HTML-fil for å returnere søkeresultatene til klientsiden.
  • Skriv ut søkeresultatet på siden slik at brukeren kan se det. Koden i HTML-filen din skal se slik ut:
{% if query %}
<div>
<div>
gå gjennom søket
{% for innlegg i innlegg %}
<div>
returner søket
<s>{{post.title}}s>
div>
{% endfor %}
div>
div>
{% annet %}
returnere en melding hvis brukeren ikke skriver inn et søk
<h1>Vennligst skriv inn et søkh1>
{% slutt om %}

HTML-malen ovenfor sjekker om brukeren skriver inn et søk i søkefeltet. Hvis brukeren skriver inn et søk, a for løkke går over søkeresultatene og returnerer dem til brukeren. Når det ikke er noe søk, vises en melding der brukeren kan skrive inn et søk. Et tilfelle der det kanskje ikke er noen søkeord, er hvis brukeren din går direkte til URL-en uten å fylle ut søkefeltet, dvs. brukeren angir en URL som f.eks. mywebsite.com/search direkte inn i nettleseren. Du bør sørge for at du bruker Djangos malarv i HTML-filen din.

  • Endre HTML-koden for å returnere en feilmelding hvis det ikke er noe søkeresultat.
{% if query %}
<div>
<div>
sjekk om det er et resultat i databasen
{% if posts %}
gå gjennom søket hvis det er et resultat
{% for innlegg i innlegg %}
<div>
returner søket
<s>{{post.title}}s>
div>
{% endfor %}
returner en melding hvis det ikke er noen resultater funnet.
{% annet %}
<h3>Ingen søkeresultater funneth3>
{% slutt om %}
div>
div>
{% annet %}
<h1>Vennligst skriv inn et søkh1>
{% slutt om %}

Den nye HTML-malen gir en bedre brukeropplevelse. Den introduserer en betinget setning for å sjekke om et søkeresultat er tilgjengelig i databasen. Hvis det er det, viser den søkeresultatet; ellers sender den brukeren en feilmelding.

Konfigurer URL-mønstrene dine

  • Hvis du ikke har gjort dette, oppretter du en urls.py filen i appkatalogen din.
  • I din urls.py, fil opprette et URL-mønster for søkesiden din:
fra django.urls import sti
fra. import visninger

urlpatterns = [
sti('Søk/', views.search_feature, name='søk-visning'),
]

Programmet ovenfor importerer først sti funksjon og visninger fil relatert til appen. Deretter oppretter den en bane som heter søk-visning for søkesiden.

  • Legg til en skjemahandling i søkefeltet. Handlings-URLen skal peke til URL-banen dedikert til søkevisningen. I dette tilfellet peker skjemaet på søk-visning.
<formklasse="d-flex"rolle="Søk"metode="POST"handling="{% url 'search-view' %}">
<input
class="form-control me-NN"
type="søk"
placeholder="Søk etter noe"
name="search_query"
obligatorisk aria-label="Søk"
>
<knappklasse="btn btn-outline-suksess"type="sende inn">Søkknapp>
form>

Uten en skjemahandling som peker til søkenettadressen din, vil ikke søkefunksjonen din fungere. Husk at din søkenettadresse må peke til Django-visningen som håndterer logikken i søkefunksjonen din.

Opprett en søkefunksjon for flere modellfelt

Hvis du vil forbedre brukeropplevelsen til nettappen din, kan du la brukerne søke etter mer enn ett felt i modellen din. For eksempel, i en blogg-app, vil du kanskje at brukeren skal søke basert på innleggstitler eller forfatternavn.

For å implementere denne funksjonen, bør du bruke Q objekt levert av Django. Du bør importere Q objekt i din views.py fil slik:

fra django.db.modeller import Q

Etter import Q, bør du endre visningsfunksjonen din slik:

defsøk_innlegg(be om):
hvis request.method == 'POST':
search_query = forespørsel. POST['søkeord']
innlegg = Post.objects.filter (Q(title__icontains=search_query) | Q(author__icontains=search_query))
komme tilbake gjengi (forespørsel, 'app/mal_name.html', {'spørsmål':søkeord, 'innlegg':posts})
ellers:
komme tilbake gjengi (forespørsel, 'app/mal_name.html',{})

I programmet ovenfor er det innlegg variabel filtrerer modellen etter enten posttittelen eller forfatterens navn. Funksjonen bruker ELLER operatør – i dette tilfellet et rørsymbol – for å utføre filteret.

Forbedre brukeropplevelsen med en søkefunksjon

En søkefunksjon i nettapplikasjonen din forbedrer effektivt brukeropplevelsen og den generelle brukervennligheten. Med Django trenger du bare å utnytte de innebygde funksjonene for å få søkefunksjonen til å fungere, noe som gir betydelige fordeler for deg og brukerne dine.