Búsqueda de empleo
Parte de la sección Vistas basadas en clases del Journey de Django de Coddy. Lección 18 de 18.
La última función es un cuadro de búsqueda en la página de empleos. Un visitante escribe developer, pulsa «Buscar» y ve solo los empleos que tienen esa palabra en el título.
Un formulario de búsqueda usa GET, así que la palabra aparece en la URL como ?q=developer, donde se conserva en un enlace o un marcador. La vista la lee igual que lee ?city=, en get_queryset(). La gente escribe en cualquier combinación de mayúsculas y minúsculas, así que busca con un filtro que no distinga entre ellas.
En una plantilla, la solicitud actual es request, así que {{ request.GET.q }} es la palabra buscada: ponla en el valor del cuadro.
Los filtros se encadenan: restringe por ciudad si hay una y después por la palabra si hay una. Los enlaces de paginación ya usan {% querystring %}, así que la búsqueda se conserva al cambiar de página.
Desafío
IntermedioAñade un cuadro de búsqueda de empleos.
- En
jobs/views.py, dentro deJobListView.get_queryset(), leeqderequest.GETigual quecity. Cuando tenga un valor, conserva solo los empleos cuyo título lo contenga, sin distinguir entre mayúsculas y minúsculas. - En
job_list.html, debajo de<h1>, añade un formulario GET: un cuadro llamadoqcuyo valor searequest.GET.q, y un botón «Search».
Busca developer: verás 4 empleos y el cuadro conservará la palabra.
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
class MyJobsView(LoginRequiredMixin, ListView):
template_name = "jobs/my_jobs.html"
context_object_name = "jobs"
def get_queryset(self):
return Job.objects.filter(posted_by=self.request.user).order_by("-posted")
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Vistas basadas en clases
Practica por tu cuenta: Playground de Django