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 en nombre de otra persona. La vista lo completa.

Para un formulario válido, una vista de edición llama a form_valid(form), que guarda la fila y redirige. Sobrescríbelo para cambiar 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, y self.kwargs contiene los argumentos de la URL. Establece tu campo y, después, deja que super().form_valid(form) guarde y redirija. Establécelo después de super() y la fila ya se habrá guardado sin ese valor.

challenge icon

Desafío

Fácil

En JobCreateView, sobrescribe form_valid() para que el posted_by de un nuevo empleo sea el usuario que inició sesión. No incluyas posted_by en fields.

Presiona Run, inicia sesión como grace (coddy-pass-123) y publica un empleo: 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