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 anuncios 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 nada que responda a él.
A partir de aquí, construyes con lo que aprendiste en 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, así que se eligen en get_queryset(), donde tienes a mano 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.
Desafío
IntermedioAñade /my-jobs/, una ruta llamada mine:
- A los visitantes que hayan cerrado sesión se les envía a iniciar sesión.
- Un usuario ve el encabezado
Your jobsy todos sus empleos en una sola página, primero los más recientes, cada uno dentro de<li class="job">con el título en<strong>. - Si no tiene ninguno:
You have not posted a job yet.
Pulsa Run, inicia sesión como ada y pulsa Your jobs.
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