Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Füge ein Suchfeld für Stellenanzeigen hinzu.

  1. Lies in jobs/views.py innerhalb von JobListView.get_queryset() q aus request.GET auf dieselbe Weise wie city aus. Wenn q gesetzt ist, behalte nur Stellenanzeigen, deren Titel den Suchbegriff enthält, ohne die Groß- und Kleinschreibung zu beachten.
  2. Füge in job_list.html unter der <h1> ein GET-Formular hinzu: ein Suchfeld mit dem Namen q, dessen Wert request.GET.q ist, 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")
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