Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Füge eine Suche zu /jobs/ hinzu:

  • Ein GET-Formular oben mit einem Feld namens q und einer Schaltfläche Search. Im Feld bleibt der Suchbegriff stehen.
  • ?q=developer listet die Jobs auf, deren Titel developer enthält, unabhängig von Groß- und Kleinschreibung.
  • ?q=engineer&city=Berlin listet 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")
quiz iconTeste dich selbst

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