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().publishedLa 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.
Desafío
IntermedioSolo quien publicó una oferta de trabajo puede editarla o eliminarla:
- Añade
UserPassesTestMixinaJobUpdateViewyJobDeleteView, después deLoginRequiredMixin. - 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")
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