Twoja strona z ofertami pracy
Część sekcji Widoki oparte na klasach ścieżki Django w Coddy. Lekcja 17 z 18.
Osoby publikujące oferty chcą mieć jedno miejsce na opublikowane przez siebie oferty. W menu zalogowani użytkownicy widzą już link Your jobs prowadzący do /my-jobs/, ale ta strona jeszcze nie istnieje.
Od tego miejsca 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. Tylko zalogowany użytkownik ma oferty do wyświetlenia. Przypisz jej własny szablon: jobs/job_list.html jest przeznaczony dla listy publicznej.
Wyzwanie
ŚredniUtwórz stronę z ofertami pracy dla każdego, kto je opublikował.
- W pliku
jobs/views.pydodajMyJobsView, dostępną tylko dla zalogowanych użytkowników. Wyświetla ona ich oferty pracy na jednej stronie, zaczynając od najnowszych. - Utwórz plik
jobs/my_jobs.htmlna podstawiejobs/base.html: dodaj<h1>z tekstemYour jobs, a następnie po jednym<li class="job">na każdą ofertę pracy, z tytułem w<strong>. Jeśli nie ma żadnych ofert, wyświetlYou have not posted a job yet. - W pliku
jobs/urls.pydodaj ścieżkęmy-jobs/o nazwiemine.
Zaloguj się jako ada (coddy-pass-123) i naciśnij Your jobs: zobaczysz jej 6 ofert pracy.
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