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 trabajo y grace puede cambiarlo. Las páginas de trabajos muestran Edit solo a quien publicó el trabajo, pero cualquiera puede escribir la dirección o enviar una solicitud POST, así que la vista debe rechazarla por sí misma.

UserPassesTestMixin llama a un método que escribes, test_func(), antes de que se ejecute la vista. True permite que la solicitud continúe; False responde con 403 Forbidden a un usuario que haya iniciado sesión, tanto en GET como en POST. En un sitio de recetas, nadie puede cambiar 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 aún no existe. self.get_object() encuentra la fila a partir de la URL, tal como lo hará la vista.

challenge icon

Desafío

Intermedio

Solo quien publicó una oferta de trabajo puede editarla o eliminarla:

  • Añade UserPassesTestMixin a JobUpdateView y JobDeleteView, después de LoginRequiredMixin.
  • La prueba solo se supera para el usuario que publicó la oferta de trabajo. Cualquier otra persona recibe 403 Forbidden, tanto en GET como en POST.

Pulsa Run, inicia sesión como grace y abre la página de edición de arriba.

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