Funkcijo iskanja integrirajte v svojo aplikacijo Django s tem vodnikom po korakih.

Če svoji spletni aplikaciji dodate funkcijo iskanja, svojim uporabnikom omogočite enostavno navigacijo z iskanjem, kar želijo. Django ponuja vgrajeno podporo za gradnjo iskalne funkcije z uporabo svojih zmogljivih orodij ORM in poizvedb. Z Django lahko izvajate različne vrste iskanj, vključno z iskanji po ključnih besedah, preprostimi iskanji in naprednimi iskanji s filtri.

Izvajanje funkcionalnosti iskanja v Djangu

Django vam omogoča izvajanje različnih vrst iskanja s svojimi vgrajenimi metodami in funkcijami. Uporabite lahko preprosto iskanje po ključnih besedah ​​ali napredno iskanje glede na vaš primer uporabe. Če imate zapleteno aplikacijo, kot je spletno mesto za e-trgovino, morate uporabiti napredno iskanje, medtem ko je preprosto iskanje po ključnih besedah ​​primerno za manj zapletene projekte.

Kodo, uporabljeno v tem članku, lahko najdete na GitHub in je brezplačen za uporabo pod licenco MIT.

Izvedite preprosto iskanje po ključnih besedah ​​v Djangu

Če želite ustvariti preprosto iskalno funkcijo, morate začeti z izdelavo iskalne vrstice. Iskalno vrstico lahko ustvarite v navbarski vrstici. Bootstrap ponuja že pripravljeno vrstico za krmarjenje z vrstico za iskanje in lahko preprosto integrirajte Bootstrap in njegove komponente v svoj projekt Django. Ustvarite iskalno vrstico v datoteki HTML, nastavite metodo obrazca na OBJAVA, in podajte vnosno polje a ime atribut, kot je ta:

<oblikarazred="d-flex"vlogo="Iskanje"metoda="POST">
 {% csrf_token %}
<vnos
class="form-control me-NN"
type="iskanje"
placeholder="Išči"
name="iskalna_poizvedba"
obvezno aria-label="Išči"
 >
<gumbrazred="btn btn-outline-success"vrsta="oddaj">Iskanjegumb>
oblika>

V zgornji kodi je ime vnosnega polja iskalna_poizvedba. Obrazec uporablja Djangov žeton CSRF do preprečiti napade CSRF. Če želite, da bo iskalna vrstica delovala, sledite tem korakom.

Ustvari pogled za iskanje

  • Odpri svojo views.py datoteko in uvozite svoj model iz models.py mapa:
od .modeli uvoz Ime modela
  • Ustvarite funkcijo pogleda za funkcijo iskanja:
defsearch_feature(prošnja):
# Preverite, ali je zahteva zahteva za objavo.
če request.method == 'POST':
# Pridobi iskalno poizvedbo, ki jo je vnesel uporabnik
search_query = zahteva. OBJAVA['search_query']
# Filtrirajte svoj model glede na iskalno poizvedbo
objave = Model.objects.filter (fieldName__contains=search_query)
vrnitev render (zahteva, 'aplikacija/ime_predloge.html', {'poizvedba':search_query, 'objave':objave})
drugače:
vrnitev render (zahteva, 'aplikacija/ime_predloge.html',{})

Zgornja funkcija najprej preveri, ali odjemalec pošilja a OBJAVI prošnja. Če je preverjanje uspešno, se nadaljuje, da pridobi vrednost uporabnikove iskalne poizvedbe, kot je ta:

search_query = zahteva. OBJAVA['search_query']

V zahtevi. OBJAVA['iskalna_poizvedba'], 'search_query' je treba nadomestiti z imenom vnosnega polja vaše iskalne vrstice.

Ko pridobi vrednost uporabnikove iskalne poizvedbe, funkcija z njo filtrira model z uporabo __vsebuje metoda. The __vsebuje metoda ne razlikuje med velikimi in malimi črkami. Če želite uporabiti to metodo, morate slediti tej obliki:

Ime polja__vsebuje

Na primer, če želite, da vaši uporabniki iščejo na podlagi polja modela, imenovanega ime, spremenite svojo kodo, da bo videti takole:

ime__vsebuje=iskalna_poizvedba

Končno funkcija upodobi predlogo in posreduje iskalno poizvedbo in filtrirani model kot kontekst.

Vendar, če metoda obrazca ni a OBJAVI zahteva, funkcija upodobi predlogo s praznim slovarjem in ne obdela iskalne poizvedbe.

Ustvarite predlogo za rezultat iskanja

  • Ustvarite datoteko HTML za vrnitev rezultatov iskanja na stran odjemalca.
  • Izdajte rezultat iskanja na strani, da ga uporabnik vidi. Koda v vaši datoteki HTML bi morala izgledati takole:
{% if query %}
<div>
<div>
prelistajte iskalno poizvedbo
{% za objavo v objavah %}
<div>
vrni iskalno poizvedbo
<str>{{post.title}}str>
div>
{% endfor %}
div>
div>
{% else %}
vrne sporočilo, če uporabnik ne vnese iskalne poizvedbe
<h1>Vnesite iskalno poizvedboh1>
{% endif %}

Zgornja predloga HTML preveri, ali uporabnik v iskalno vrstico vnese iskalno poizvedbo. Če uporabnik vnese iskalno poizvedbo, a za zanko preleti rezultate iskanja in jih vrne uporabniku. Če ni iskalne poizvedbe, se uporabniku prikaže sporočilo, da vnese iskalno poizvedbo. Primer, ko morda ni iskalne poizvedbe, je, če gre vaš uporabnik neposredno na URL, ne da bi izpolnil iskalno vrstico, tj. vaš uporabnik vnese URL, kot je mywebsite.com/search neposredno v brskalnik. Zagotoviti morate, da uporabljate Djangovo dedovanje predloge v vaši datoteki HTML.

  • Spremenite kodo HTML, da bo vrnila sporočilo o napaki, če ni rezultatov iskanja.
{% if query %}
<div>
<div>
preverite, ali je rezultat v bazi
{% if posts %}
prelistajte iskalno poizvedbo, če je rezultat
{% za objavo v objavah %}
<div>
vrni iskalno poizvedbo
<str>{{post.title}}str>
div>
{% endfor %}
vrni sporočilo, če ni najdenih rezultatov.
{% else %}
<h3>Ni rezultatov iskanjah3>
{% endif %}
div>
div>
{% else %}
<h1>Vnesite iskalno poizvedboh1>
{% endif %}

Nova predloga HTML omogoča boljšo uporabniško izkušnjo. Uvaja pogojni stavek za preverjanje, ali je rezultat iskanja na voljo v bazi podatkov. Če obstaja, prikaže rezultat iskanja; v nasprotnem primeru pošlje uporabniku sporočilo o napaki.

Konfigurirajte svoje vzorce URL-jev

  • Če tega še niste storili, ustvarite urls.py datoteko v vašem imeniku aplikacij.
  • V vašem urls.py, ustvari vzorec URL-ja za vašo iskalno stran:
od django.urls uvoz pot
od. uvoz pogledi

urlvzorci = [
pot('Iskanje/', views.search_feature, name='search-view'),
]

Zgornji program najprej uvozi pot funkcijo in pogledi datoteko, povezano z aplikacijo. Nato ustvari pot z imenom iskanje-pogled za iskalno stran.

  • V iskalno vrstico dodajte dejanje obrazca. URL dejanja mora kazati na pot URL-ja, namenjeno iskalnemu pogledu. V tem primeru obrazec kaže na iskanje-pogled.
<oblikarazred="d-flex"vlogo="Iskanje"metoda="POST"ukrepanje="{% url 'search-view' %}">
<vnos
class="form-control me-NN"
type="iskanje"
placeholder="Išči nekaj"
name="iskalna_poizvedba"
obvezno aria-label="Išči"
>
<gumbrazred="btn btn-outline-success"vrsta="oddaj">Iskanjegumb>
oblika>

Brez dejanja obrazca, ki kaže na vašo iskalno URL pot, vaša iskalna funkcija ne bo delovala. Ne pozabite, da mora vaša iskalna URL pot kazati na pogled Django, ki obravnava logiko vaše iskalne funkcije.

Ustvari funkcijo iskanja za več polj modela

Če želite izboljšati uporabniško izkušnjo vaše spletne aplikacije, lahko svojim uporabnikom omogočite iskanje po več kot enem polju v vašem modelu. Na primer, v aplikaciji za spletni dnevnik boste morda želeli, da vaš uporabnik išče na podlagi naslovov objav ali imen avtorjev.

Za izvedbo te funkcije bi morali uporabiti Q predmet, ki ga je zagotovil Django. Moral bi uvoziti Q predmet v vašem views.py datoteka, kot je ta:

od django.db.models uvoz Q

Po uvozu Q, morate svojo funkcijo pogleda spremeniti takole:

defsearch_post(prošnja):
če request.method == 'POST':
search_query = zahteva. OBJAVA['search_query']
objave = Post.objects.filter (Q(title__icontains=search_query) | Q(author__icontains=search_query))
vrnitev render (zahteva, 'aplikacija/ime_predloge.html', {'poizvedba':search_query, 'objave':objave})
drugače:
vrnitev render (zahteva, 'aplikacija/ime_predloge.html',{})

V zgornjem programu je objave spremenljivka filtrira model po naslovu objave ali avtorjevem imenu. Funkcija uporablja ALI operator – v tem primeru simbol cevi – za izvedbo filtra.

Izboljšanje uporabniške izkušnje s funkcijo iskanja

Funkcija iskanja v vaši spletni aplikaciji učinkovito izboljša njeno uporabniško izkušnjo in splošno uporabnost. Z Django morate samo izkoristiti vgrajene funkcije, da bo vaša funkcija iskanja delovala, kar vam in vašim uporabnikom zagotavlja pomembne koristi.