Twoja strona z ofertami pracy
Część sekcji Widoki oparte na klasach ścieżki Django w Coddy. Lekcja 17 z 18.
Osoby publikujące ogłoszenia chcą mieć jedno miejsce na opublikowane przez siebie oferty pracy. Menu wyświetla już zalogowanym użytkownikom link Your jobs prowadzący do /my-jobs/, ale na razie nic go nie obsługuje.
Od tego momentu tworzysz rozwiązanie na podstawie tego, czego nauczyła Cię ta sekcja, bez przykładu. Strona zawiera listę, więc jest to ListView. Jej wiersze zależą od tego, kto wysyła zapytanie, dlatego wybiera się je w get_queryset(), gdzie dostępne jest self.request.user. Oferty pracy do wyświetlenia ma tylko zalogowany użytkownik. Utwórz dla niej osobny szablon: jobs/job_list.html należy do publicznej listy.
Wyzwanie
ŚredniDodaj /my-jobs/, trasę o nazwie mine:
- Wylogowani użytkownicy są przekierowywani do logowania.
- Użytkownik widzi nagłówek
Your jobsi wszystkie swoje oferty pracy na jednej stronie, od najnowszej, każdą w elemencie<li class="job">, z tytułem w elemencie<strong>. - Jeśli nie ma żadnych ofert:
You have not posted a job yet.
Naciśnij Run, zaloguj się jako ada i naciśnij Your jobs.
Spróbuj swoich sił
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
Wszystkie lekcje w sekcji Widoki oparte na klasach
2Generyczne widoki wyświetlania
ListViewDetailViewPoćwicz samodzielnie: Edytor online Django