Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Erstelle die Seite hinter Post a job mit der fertigen Vorlage jobs/job_form.html.

  1. Füge in jobs/views.py JobCreateView hinzu, eine CreateView für Job mit den Feldern title, company, city, salary und description.
  2. Füge in jobs/urls.py die Route "jobs/new/" mit dem Namen create hinzu.

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

Übe selbstständig: Django-Playground