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.
Desafío
IntermedioCrea la página que hay detrás de Post a job, con la plantilla lista jobs/job_form.html.
- En
jobs/views.py, añadeJobCreateView, unaCreateViewdeJobcon los campostitle,company,city,salaryydescription. - En
jobs/urls.py, añade la ruta"jobs/new/"con el nombrecreate.
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