Menu
CoddyTech

CreateView

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

El menú tiene un enlace Post a job que no lleva a ninguna página. Una página que añade una fila usa siempre el mismo código: mostrar un formulario vacío, comprobar lo que se envió, guardarlo y redirigir. CreateView es ese código, con un ModelForm que crea por ti:

from django.views.generic import CreateView


class RecipeCreateView(CreateView):
    model = Recipe
    fields = ["title", "cuisine", "minutes"]

fields enumera los campos del formulario, como Meta de un ModelForm. La plantilla predeterminada es recipes/recipe_form.html, y el formulario está disponible como form. Si los datos no son válidos, se vuelve a mostrar el formulario con sus errores y no se guarda nada.

Coloca la ruta "recipes/new/" encima de "recipes/<slug:slug>/". Django usa la primera ruta que coincide. new es un slug válido, así que una ruta para slugs colocada encima de esta capturará /recipes/new/ y responderá con un 404.

challenge icon

Desafío

Intermedio

Crea la página que hay detrás de Post a job, con la plantilla lista jobs/job_form.html.

  1. En jobs/views.py, añade JobCreateView, una CreateView de Job con los campos title, company, city, salary y description.
  2. En jobs/urls.py, añade la ruta "jobs/new/" con el nombre create.

Publica una oferta de empleo: se guarda y, después, Django se detiene con No URL to redirect to, algo que se soluciona en la siguiente lección.

Pruébalo tú mismo

from django.views.generic import DetailView, ListView, TemplateView

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

Todas las lecciones de Vistas basadas en clases

Practica por tu cuenta: Playground de Django