Menu
CoddyTech

La tua pagina delle offerte di lavoro

Fa parte della sezione View basate su classi del percorso Django di Coddy. Lezione 17 di 18.

Chi pubblica annunci vuole un unico posto per gli annunci che ha pubblicato. Il menu mostra già agli utenti che hanno effettuato l’accesso un link Your jobs a /my-jobs/, ma la pagina non esiste ancora.

Da qui costruisci usando ciò che hai imparato in questa sezione, senza un esempio. La pagina è un elenco, quindi è una ListView. Le sue righe dipendono da chi le richiede, quindi vengono selezionate in get_queryset(), dove è disponibile self.request.user. Solo un utente che ha effettuato l’accesso ha annunci da vedere. Assegna alla pagina un modello dedicato: jobs/job_list.html appartiene all’elenco pubblico.

challenge icon

Sfida

Medio

Assegna a ogni autore degli annunci una pagina con i propri annunci di lavoro.

  1. In jobs/views.py, aggiungi MyJobsView, solo per gli utenti che hanno effettuato l’accesso. Elenca i loro annunci di lavoro, dal più recente al meno recente, in un’unica pagina.
  2. Crea jobs/my_jobs.html a partire da jobs/base.html: un <h1> Your jobs, poi un <li class="job"> per ogni annuncio di lavoro, con il titolo in <strong>. Se non ce ne sono, mostra You have not posted a job yet.
  3. In jobs/urls.py, aggiungi my-jobs/ con il nome mine.

Accedi come ada (coddy-pass-123) e premi Your jobs: vedrai i suoi 6 annunci di lavoro.

Provalo tu

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

Tutte le lezioni di View basate su classi

Esercitati da solo: Playground Django