Menu
CoddyTech

Tu página de empleos

Parte de la sección Vistas basadas en clases del Journey de Django de Coddy. Lección 17 de 18.

Quienes publican ofertas quieren tener en un solo lugar los empleos que publicaron. El menú ya muestra a los usuarios que iniciaron sesión un enlace Your jobs a /my-jobs/, pero todavía no hay ninguna página allí.

A partir de aquí, construyes con lo que enseñó esta sección, sin un ejemplo. La página es una lista, así que es una ListView. Sus filas dependen de quién la solicita, por lo que se eligen en get_queryset(), donde está disponible self.request.user. Solo un usuario que haya iniciado sesión tiene empleos que ver. Asígnale una plantilla propia: jobs/job_list.html corresponde a la lista pública.

challenge icon

Desafío

Intermedio

Dale a cada anunciante una página con sus propios empleos.

  1. En jobs/views.py, añade MyJobsView, solo para usuarios que hayan iniciado sesión. Muestra sus empleos, del más reciente al más antiguo, en una sola página.
  2. Crea jobs/my_jobs.html a partir de jobs/base.html: un <h1> Your jobs, luego un <li class="job"> por empleo, con el título dentro de <strong>. Si no hay ninguno, muestra You have not posted a job yet.
  3. En jobs/urls.py, añade my-jobs/ con el nombre mine.

Inicia sesión como ada (coddy-pass-123) y pulsa Your jobs: verás sus 6 empleos.

Pruébalo tú mismo

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

Todas las lecciones de Vistas basadas en clases

Practica por tu cuenta: Playground de Django