CreateView
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 10 von 18.
Im Menü gibt es einen Link Post a job, hinter dem keine Seite liegt. Eine Seite, die eine Zeile hinzufügt, verwendet jedes Mal denselben Code: ein leeres Formular anzeigen, prüfen, was übermittelt wurde, es speichern und weiterleiten. CreateView ist dieser Code und erstellt für dich ein ModelForm:
from django.views.generic import CreateView
class RecipeCreateView(CreateView):
model = Recipe
fields = ["title", "cuisine", "minutes"]fields listet die Felder des Formulars auf, ähnlich wie Meta eines ModelForm. Die Vorlage ist standardmäßig recipes/recipe_form.html, wobei das Formular als form verfügbar ist. Bei ungültigen Daten wird das Formular erneut mit seinen Fehlern angezeigt, und nichts wird gespeichert.
Füge die Route "recipes/new/" oberhalb von "recipes/<slug:slug>/" ein. Django verwendet die erste passende Route. new ist ein gültiger Slug. Wenn also eine Slug-Route davor steht, fängt sie /recipes/new/ ab und antwortet mit 404.
Aufgabe
MittelErstelle die Seite hinter Post a job mit der fertigen Vorlage jobs/job_form.html.
- Füge in
jobs/views.pyJobCreateViewhinzu, eineCreateViewfürJobmit den Felderntitle,company,city,salaryunddescription. - Füge in
jobs/urls.pydie Route"jobs/new/"mit dem Namencreatehinzu.
Eintrag veröffentlichen: Er wird gespeichert, dann bricht Django mit No URL to redirect to ab. Das wird in der nächsten Lektion behoben.
Probier es selbst
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
Alle Lektionen in Klassenbasierte Views
4Ansichten bearbeiten
CreateViewAuf der neuen Stelle landenÜbe selbstständig: Django-Playground