Menu
CoddyTech

İş Arama

Coddy'nin Django Journey'sinin Sınıf Tabanlı Görünümler bölümünün bir parçası. Ders 18 / 18.

Son özellik, iş ilanları sayfasındaki bir arama kutusudur. Bir ziyaretçi developer yazar, Ara’ya basar ve başlığında bu kelime bulunan iş ilanlarını görür.

Arama formu GET kullanır, bu yüzden kelime URL’de ?q=developer olarak yer alır ve bir bağlantıda ya da yer işaretinde korunur. Görünüm, get_queryset() içinde, bu değeri ?city= değerini okuduğu gibi okur. Kullanıcılar büyük-küçük harf fark etmeksizin yazabilir; bu yüzden bu farkı yok sayan bir arama kullanın.

Filtreler zincirleme uygulanır: şehir varsa önce şehre göre, ardından arama kelimesi varsa kelimeye göre daraltılır. Sayfalama bağlantıları zaten {% querystring %} kullandığından, sayfa değiştirildiğinde arama korunur.

challenge icon

Görev

Orta

/jobs/ sayfasına bir arama ekle:

  • En üstte, q adlı bir kutu ve bir Search düğmesi bulunan bir GET formu oluştur. Kutu, aranan kelimeyi korur.
  • ?q=developer, başlığı büyük-küçük harf fark etmeksizin developer içeren işleri listeler.
  • ?q=engineer&city=Berlin, Berlin'deki mühendislik işlerini listeler.

Run'a bas ve developer için arama yap.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Sınıf Tabanlı Görünümler bölümündeki tüm dersler

Kendi başına pratik yap: Django playground