Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Añade un cuadro de búsqueda de empleos.

  1. En jobs/views.py, dentro de JobListView.get_queryset(), lee q de request.GET igual que city. Cuando tenga un valor, conserva solo los empleos cuyo título lo contenga, sin distinguir entre mayúsculas y minúsculas.
  2. En job_list.html, debajo de <h1>, añade un formulario GET: un cuadro llamado q cuyo valor sea request.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")
quiz iconPonte a prueba

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