Jobsuche
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 18 von 18.
Die letzte Funktion ist ein Suchfeld auf der Stellenangebotsseite. Ein Besucher gibt developer ein, klickt auf „Suchen“ und sieht nur die Stellenangebote, in deren Titel dieses Wort vorkommt.
Ein Suchformular verwendet GET, sodass das Wort in der URL als ?q=developer erscheint und dort von einem Link oder Lesezeichen gespeichert wird. Die Ansicht liest es genauso aus wie ?city=, und zwar in get_queryset(). Da die Nutzer Wörter in beliebiger Groß- und Kleinschreibung eingeben, verwende einen Lookup, der diese ignoriert.
Filter lassen sich verketten: Zuerst wird nach der Stadt gefiltert, wenn eine angegeben wurde, dann nach dem Wort, wenn eines angegeben wurde. Die Paginierungslinks verwenden bereits {% querystring %}, sodass eine Suche beim Seitenwechsel erhalten bleibt.
Aufgabe
MittelFüge eine Suche zu /jobs/ hinzu:
- Ein GET-Formular oben mit einem Feld namens
qund einer SchaltflächeSearch. Im Feld bleibt der Suchbegriff stehen. ?q=developerlistet die Jobs auf, deren Titeldeveloperenthält, unabhängig von Groß- und Kleinschreibung.?q=engineer&city=Berlinlistet die Berliner Jobs für Ingenieure auf.
Klicke auf Run und suche nach developer.
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