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. Una persona visita el sitio, 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(). Las personas escriben en cualquier combinación de mayúsculas y minúsculas, así que busca con una consulta que no distinga entre ellas.
Los filtros se encadenan: limita por ciudad cuando hay una y después por la palabra cuando la hay. Los enlaces de paginación ya usan {% querystring %}, así que la búsqueda se conserva al cambiar de página.
Desafío
IntermedioAñade una búsqueda a /jobs/:
- Un formulario GET en la parte superior con un campo llamado
qy un botónSearch. El campo conserva la palabra buscada. ?q=developermuestra los trabajos cuyo título contienedeveloper, sin distinguir entre mayúsculas y minúsculas.?q=engineer&city=Berlinmuestra los trabajos de ingeniería de Berlín.
Pulsa Run y busca developer.
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