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ınladıkları iş ilanlarını tek bir yerde görmek istiyor. Menüde oturum açmış kullanıcılara /my-jobs/ bağlantısına giden Your jobs bağlantısı zaten gösteriliyor, ancak henüz orada bir sayfa yok.

Buradan itibaren, bir örnek olmadan bu bölümde öğrendiklerini kullanarak sayfayı oluşturacaksın. Sayfa bir liste olduğundan, bir ListView'dır. Satırları, kimin istediğine bağlıdır; bu nedenle self.request.user değerinin kullanılabildiği get_queryset() içinde seçilir. Görüntülenecek işleri yalnızca oturum açmış bir kullanıcıya ait olabilir. Sayfaya kendine ait bir şablon ver: jobs/job_list.html, herkese açık listeye aittir.

challenge icon

Görev

Orta

İlanı yayınlayan her kullanıcıya kendi ilanlarının bulunduğu bir sayfa verin.

  1. jobs/views.py dosyasına yalnızca oturum açmış kullanıcılar için MyJobsView ekleyin. Kullanıcının ilanlarını en yeniden eskiye doğru tek bir sayfada listeler.
  2. jobs/base.html dosyasını temel alarak jobs/my_jobs.html oluşturun: bir <h1> içinde Your jobs, ardından her ilan için başlığın <strong> içinde olduğu bir <li class="job">. Hiç ilan yoksa You have not posted a job yet. gösterin.
  3. jobs/urls.py dosyasına adı mine olan my-jobs/ yolunu ekleyin.

ada (coddy-pass-123) olarak oturum açıp Your jobs düğmesine basın: onun 6 ilanını görürsünüz.

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