Menu
CoddyTech

İş İlanları Sayfanız

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

İlan verenler, yayımladıkları iş ilanları için tek bir yer istiyor. Menü, oturum açmış kullanıcılara zaten Your jobs bağlantısını ve /my-jobs/ adresini gösteriyor, ancak henüz bu adrese yanıt veren bir şey yok.

Buradan itibaren, örnek olmadan bu bölümde öğrendiklerinle oluşturacaksın. Sayfa bir liste, dolayısıyla bir ListView. Satırları kimin istediğine bağlı, bu yüzden self.request.user değerinin kullanılabildiği get_queryset() içinde seçiliyorlar. Yalnızca oturum açmış kullanıcıların görebileceği iş ilanları vardır. Ona kendine ait bir şablon ver: jobs/job_list.html herkese açık listeye aittir.

challenge icon

Görev

Orta

/my-jobs/ yolunu, adı mine olan bir rota olarak ekle:

  • Oturum açmamış ziyaretçiler oturum açma sayfasına yönlendirilir.
  • Kullanıcı, Your jobs başlığını ve tüm işlerini tek bir sayfada, en yeniden başlayarak görür; her iş, başlığı <strong> içinde olacak şekilde <li class="job"> içinde gösterilir.
  • Hiç işi yoksa: You have not posted a job yet.

Run'a bas, ada olarak oturum aç ve Your jobs'a bas.

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

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

Kendi başına pratik yap: Django playground