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 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.

challenge icon

Wyzwanie

Średni

Utwórz stronę z ofertami pracy dla każdego, kto je opublikował.

  1. W pliku jobs/views.py dodaj MyJobsView, dostępną tylko dla zalogowanych użytkowników. Wyświetla ona ich oferty pracy na jednej stronie, zaczynając od najnowszych.
  2. Utwórz plik jobs/my_jobs.html na podstawie jobs/base.html: dodaj <h1> z tekstem Your 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świetl You have not posted a job yet.
  3. W pliku jobs/urls.py dodaj ścieżkę my-jobs/ o nazwie mine.

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

Poćwicz samodzielnie: Edytor online Django