Jobsuche
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 18 von 18.
Das letzte Feature ist ein Suchfeld auf der Jobseite. Ein Besucher gibt developer ein, drückt auf „Suchen“ und sieht nur die Jobs, die dieses Wort im Titel enthalten.
Ein Suchformular verwendet GET, sodass das Wort in der URL als ?q=developer erscheint, wo es durch einen Link oder ein Lesezeichen erhalten bleibt. Die View liest es auf dieselbe Weise wie ?city=, in get_queryset(). Nutzer geben Wörter in beliebiger Groß- und Kleinschreibung ein, also verwende einen Lookup, der diese ignoriert.
In einem Template ist die aktuelle Anfrage request, also ist {{ request.GET.q }} das gesuchte Wort: Füge es in den Wert des Suchfelds ein.
Filter lassen sich verketten: schränke zuerst nach Stadt ein, falls eine angegeben wurde, und dann nach dem Wort, falls eines angegeben wurde. Die Paginierungslinks verwenden bereits {% querystring %}, sodass die Suche beim Seitenwechsel erhalten bleibt.
Aufgabe
MittelFüge ein Suchfeld für Stellenanzeigen hinzu.
- Lies in
jobs/views.pyinnerhalb vonJobListView.get_queryset()qausrequest.GETauf dieselbe Weise wiecityaus. Wennqgesetzt ist, behalte nur Stellenanzeigen, deren Titel den Suchbegriff enthält, ohne die Groß- und Kleinschreibung zu beachten. - Füge in
job_list.htmlunter der<h1>ein GET-Formular hinzu: ein Suchfeld mit dem Namenq, dessen Wertrequest.GET.qist, und eine Schaltfläche „Search“.
Suche nach developer: Du siehst 4 Stellenanzeigen und das Suchfeld behält das Wort bei.
Probier es selbst
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.urls import reverse_lazy
from django.views.generic import CreateView, DeleteView, DetailView, ListView, TemplateView, UpdateView
from .models import Job
class HomeView(TemplateView):
template_name = "jobs/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["count"] = Job.objects.count()
context["latest"] = Job.objects.order_by("-posted").first()
return context
class AboutView(TemplateView):
template_name = "jobs/about.html"
class JobListView(ListView):
model = Job
context_object_name = "jobs"
ordering = ["-posted"]
paginate_by = 5
def get_queryset(self):
jobs = super().get_queryset()
city = self.request.GET.get("city")
if city:
jobs = jobs.filter(city=city)
return jobs
class JobDetailView(DetailView):
model = Job
class JobCreateView(LoginRequiredMixin, CreateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
def form_valid(self, form):
form.instance.posted_by = self.request.user
return super().form_valid(form)
class JobUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
def test_func(self):
return self.get_object().posted_by == self.request.user
class JobDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Job
success_url = reverse_lazy("jobs:list")
def test_func(self):
return self.get_object().posted_by == self.request.user
class MyJobsView(LoginRequiredMixin, ListView):
template_name = "jobs/my_jobs.html"
context_object_name = "jobs"
def get_queryset(self):
return Job.objects.filter(posted_by=self.request.user).order_by("-posted")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Klassenbasierte Views
Übe selbstständig: Django-Playground