Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Dodaj /my-jobs/, trasę o nazwie mine:

  • Wylogowani użytkownicy są przekierowywani do logowania.
  • Użytkownik widzi nagłówek Your jobs i 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

Poćwicz samodzielnie: Edytor online Django