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().publishedLa 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.
Desafío
IntermedioSolo 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")
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
4Vistas de edición
CreateViewLlegar a la nueva oferta de empleoPractica por tu cuenta: Playground de Django