Menu
CoddyTech

Solo quien publicó la oferta puede editarla

Parte de la sección Vistas basadas en clases del Journey de Django de Coddy. Lección 16 de 18.

Inicia sesión como grace y abre /jobs/python-developer-brightline/edit/: ada publicó ese empleo y grace puede modificarlo. Las páginas de empleos muestran Edit solo a quien publicó el empleo, pero cualquiera puede escribir la dirección o enviar un POST, así que la propia vista debe rechazarlo.

UserPassesTestMixin llama a un método que escribes, test_func(), antes de que se ejecute la vista. Cuando devuelve True, la solicitud continúa. Cuando devuelve False, un usuario que haya iniciado sesión recibe una respuesta 403 Forbidden, tanto para un GET como para un POST. En un sitio de recetas no se permite a nadie modificar una receta publicada:

class RecipeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Recipe
    fields = ["title", "minutes"]

    def test_func(self):
        return not self.get_object().published

La prueba se ejecuta antes de que la vista haya buscado la fila, así que self.object todavía no existe. self.get_object() encuentra la fila a partir de la URL, igual que lo hará la vista.

challenge icon

Desafío

Intermedio

Solo quien publicó una oferta de empleo puede editarla o eliminarla. En jobs/views.py, añade UserPassesTestMixin a JobUpdateView y JobDeleteView, después de LoginRequiredMixin. La prueba solo se supera para el usuario que publicó la oferta; cualquier otra persona recibe 403 Forbidden, tanto con GET como con POST.

Inicia sesión como grace (coddy-pass-123) y abre /jobs/python-developer-brightline/edit/: la publicó ada, así que verás el error 403 Forbidden.

Pruébalo tú mismo

from django.contrib.auth.mixins import LoginRequiredMixin
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, UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobDeleteView(LoginRequiredMixin, DeleteView):
    model = Job
    success_url = reverse_lazy("jobs:list")
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