Integrera sökfunktionen i din Django-applikation med hjälp av denna steg-för-steg-guide.
Genom att lägga till en sökfunktion i din webbapplikation kan dina användare enkelt navigera i den genom att söka efter vad de vill ha. Django tillhandahåller inbyggt stöd för att bygga en sökfunktion genom att använda dess kraftfulla ORM- och frågeverktyg. Med Django kan du implementera olika typer av sökningar, inklusive nyckelordssökningar, enkla sökningar och avancerade sökningar med filter.
Implementering av sökfunktioner i Django
Django låter dig implementera olika typer av sökningar med dess inbyggda metoder och funktioner. Du kan implementera en enkel nyckelordssökning eller en avancerad sökning baserat på ditt användningsfall. Du bör implementera en avancerad sökning om du har en komplex applikation, till exempel en e-handelswebbplats, medan en enkel sökordssökning lämpar sig för mindre komplexa projekt.
Koden som används i den här artikeln finns på GitHub och är gratis för dig att använda under MIT-licensen.
Implementera en enkel nyckelordssökning i Django
För att skapa en enkel sökfunktion bör du börja med att bygga ditt sökfält. Du kan bygga ditt sökfält i ditt navigeringsfält. Bootstrap tillhandahåller ett färdigt navigeringsfält med sökfält, och du kan enkelt integrera Bootstrap och dess komponenter i ditt Django-projekt. Skapa ditt sökfält i en HTML-fil, ställ in formulärmetoden till POSTA, och ge inmatningsfältet en namn attribut så här:
<formklass="d-flex"roll="Sök"metod="POSTA">
{% csrf_token %}
<inmatning
class="form-control me-NN"
type="sök"
placeholder="Sök"
name="search_query"
obligatorisk aria-label="Sök"
>
<knappklass="btn btn-outline-framgång"typ="Skicka in">Sökknapp>
form>
I koden ovan är namnet på inmatningsfältet Sök fråga. Formen använder sig av Djangos CSRF-token till förhindra CSRF-attacker. Följ dessa steg för att få ditt sökfält att fungera.
Skapa en vy för sökningen
- Öppna din views.py fil och importera din modell från models.py fil:
från .modeller importera Modellnamn
- Skapa en visningsfunktion för sökfunktionen:
defsökfunktion(begäran):
# Kontrollera om begäran är en postförfrågan.
om request.method == 'POSTA':
# Hämta sökfrågan som angetts av användaren
sökfråga = begäran. POSTA['Sök fråga']
# Filtrera din modell efter sökfrågan
posts = Model.objects.filter (fieldName__contains=search_query)
lämna tillbaka rendera (begäran, 'app/template_name.html', {'fråga':Sök fråga, "inlägg":posts})
annan:
lämna tillbaka rendera (begäran, 'app/template_name.html',{})
Ovanstående funktion kontrollerar först om klienten skickar en POSTA begäran. Om kontrollen godkänns går den vidare för att hämta värdet på användarens sökfråga så här:
sökfråga = begäran. POSTA['Sök fråga']
På begäran. POST['search_query'], 'Sök fråga' ska ersättas med namnet på sökfältets inmatningsfält.
Efter att ha hämtat värdet på användarens sökfråga filtrerar funktionen modellen med den genom att använda __innehåller metod. De __innehåller Metoden är skiftlägesokänslig. För att använda den här metoden bör du följa detta format:
fältnamn__innehåller
Till exempel om du vill att dina användare ska söka baserat på ett modellfält som heter namn, bör du ändra din kod så att den ser ut så här:
name__contains=search_query
Slutligen renderar funktionen en mall och skickar sökfrågan och den filtrerade modellen som kontext.
Men om formulärets metod inte är en POSTA begäran, renderar funktionen en mall med en tom ordbok och bearbetar inte sökfrågan.
Skapa en mall för sökresultatet
- Skapa en HTML-fil för att returnera dina sökresultat till klientsidan.
- Skriv ut sökresultatet på sidan så att användaren kan se det. Koden i din HTML-fil ska se ut så här:
{% if query %}
<div>
<div>
gå igenom sökfrågan
{% för inlägg i inlägg %}
<div>
returnera sökfrågan
<sid>{{Post titel}}sid>
div>
{% slutför %}
div>
div>
{% annat %}
returnera ett meddelande om användaren inte anger en sökfråga
<h1>Vänligen ange en sökfrågah1>
{% endif %}
HTML-mallen ovan kontrollerar om användaren anger en sökfråga i sökfältet. Om användaren anger en sökfråga, a för slinga går över sökresultaten och returnerar dem till användaren. När det inte finns någon sökfråga visas ett meddelande för användaren att ange en sökfråga. Ett fall där det kanske inte finns någon sökfråga är om din användare går direkt till URL: en utan att fylla i sökfältet, d.v.s. din användare anger en URL som t.ex. mywebsite.com/search direkt in i webbläsaren. Du bör se till att du använder Djangos mallarv i din HTML-fil.
- Ändra din HTML-kod för att returnera ett felmeddelande om det inte finns något sökresultat.
{% if query %}
<div>
<div>
kontrollera om det finns ett resultat i databasen
{% if posts %}
gå igenom sökfrågan om det finns ett resultat
{% för inlägg i inlägg %}
<div>
returnera sökfrågan
<sid>{{Post titel}}sid>
div>
{% slutför %}
returnera ett meddelande om det inte finns några resultat.
{% annat %}
<h3>Inga sökresultat hittadesh3>
{% endif %}
div>
div>
{% annat %}
<h1>Vänligen ange en sökfrågah1>
{% endif %}
Den nya HTML-mallen möjliggör en bättre användarupplevelse. Den introducerar ett villkorligt uttalande för att kontrollera om ett sökresultat är tillgängligt i databasen. Om det finns, visar den sökresultatet; annars skickas ett felmeddelande till användaren.
Konfigurera dina URL-mönster
- Om du inte har gjort detta, skapa en urls.py filen i din appkatalog.
- I din urls.py, fil skapa ett URL-mönster för din söksida:
från django.urls importera väg
från. importera vyer
urlpatterns = [
väg('Sök/', views.search_feature, name='sökvy'),
]
Programmet ovan importerar först väg funktion och vyer fil relaterad till appen. Sedan skapas en sökväg som heter sökvy för söksidan.
- Lägg till en formuläråtgärd i sökfältet. Åtgärdswebbadressen ska peka på webbadressens sökväg som är dedikerad till sökvyn. I det här fallet pekar formuläret på sökvy.
<formklass="d-flex"roll="Sök"metod="POSTA"handling="{% url 'search-view' %}">
<inmatning
class="form-control me-NN"
type="sök"
placeholder="Sök efter något"
name="search_query"
obligatorisk aria-label="Sök"
>
<knappklass="btn btn-outline-framgång"typ="Skicka in">Sökknapp>
form>
Utan en formuläråtgärd som pekar på din sökväg för webbadressen kommer din sökfunktion inte att fungera. Kom ihåg att din sök-URL-sökväg måste peka till Django-vyn som hanterar logiken i din sökfunktion.
Skapa en sökfunktion för flera modellfält
Om du vill förbättra användarupplevelsen av din webbapp kan du låta dina användare söka efter mer än ett fält i din modell. Till exempel, i en bloggapp kanske du vill att din användare ska söka baserat på inläggstitlar eller författarnamn.
För att implementera den här funktionen bör du använda F objekt som tillhandahålls av Django. Du bör importera F objekt i din views.py fil så här:
från django.db.modeller importera F
Efter import F, bör du ändra din visningsfunktion så här:
defsök_inlägg(begäran):
om request.method == 'POSTA':
sökfråga = begäran. POSTA['Sök fråga']
inlägg = Post.objects.filter (Q(title__icontains=search_query) | Q(author__icontains=search_query))
lämna tillbaka rendera (begäran, 'app/template_name.html', {'fråga':Sök fråga, "inlägg":posts})
annan:
lämna tillbaka rendera (begäran, 'app/template_name.html',{})
I programmet ovan visas inlägg variabeln filtrerar modellen efter antingen inläggets titel eller författarens namn. Funktionen använder ELLER operatör – i det här fallet en rörsymbol – för att utföra filtret.
Förbättra användarupplevelsen med en sökfunktion
En sökfunktion i din webbapplikation förbättrar effektivt dess användarupplevelse och övergripande användbarhet. Med Django behöver du bara utnyttja de inbyggda funktionerna för att få din sökfunktion att fungera, vilket ger betydande fördelar för dig och dina användare.