Menu
CoddyTech

Establecer quién publicó la oferta

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

Cada Job tiene un campo posted_by, y los trabajos nuevos lo dejan vacío. No debe ser un campo del formulario, o cualquiera podría publicar con el nombre de otra persona. La vista lo rellena.

Cuando el formulario es válido, una vista de edición llama a form_valid(form), que guarda la fila y redirige. Sobrescríbela para modificar primero la fila. Un sitio de recetas guarda cada reseña en la receta indicada en su URL, recipes/<slug:slug>/review/:

class ReviewCreateView(LoginRequiredMixin, CreateView):
    model = Review
    fields = ["stars", "text"]

    def form_valid(self, form):
        recipe = get_object_or_404(Recipe, slug=self.kwargs["slug"])
        form.instance.recipe = recipe
        return super().form_valid(form)

form.instance es la fila aún no guardada. self.kwargs contiene los argumentos de la URL; solo este ejemplo lo necesita para encontrar la receta. Asigna tu campo y luego deja que super().form_valid(form) guarde y redirija. Si lo asignas después de super(), la fila ya se habrá guardado sin ese valor.

challenge icon

Desafío

Fácil

En JobCreateView, sobrescribe form_valid() para que posted_by de una nueva oferta de trabajo sea el usuario que inició sesión. Deja posted_by fuera de fields.

Inicia sesión como grace (coddy-pass-123) y publica una oferta de trabajo: su página muestra by grace después de la fecha.

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"]


class JobUpdateView(LoginRequiredMixin, UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobDeleteView(LoginRequiredMixin, DeleteView):
    model = Job
    success_url = reverse_lazy("jobs:list")

Todas las lecciones de Vistas basadas en clases

Practica por tu cuenta: Playground de Django