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. 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.

challenge icon

Desafío

Intermedio

Añade una búsqueda a /jobs/:

  • Un formulario GET en la parte superior con un campo llamado q y un botón Search. El campo conserva la palabra buscada.
  • ?q=developer muestra los trabajos cuyo título contiene developer, sin distinguir entre mayúsculas y minúsculas.
  • ?q=engineer&city=Berlin muestra 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")
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