İş İ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.
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 jobsbaş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