Menu
CoddyTech

CreateView

Termasuk bagian View Berbasis Class dalam perjalanan Django di Coddy. Pelajaran 10 dari 18.

Menu memiliki tautan Post a job tanpa halaman di baliknya. Halaman yang menambahkan satu baris selalu menggunakan kode yang sama: tampilkan formulir kosong, periksa data yang dikirim, simpan, lalu alihkan. CreateView adalah kode itu, dengan ModelForm yang dibuat untukmu:

from django.views.generic import CreateView


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

fields mencantumkan kolom formulir, seperti Meta milik ModelForm. Template default-nya adalah recipes/recipe_form.html, dengan formulir sebagai form. Data yang tidak valid akan menampilkan formulir lagi beserta error-nya, dan tidak ada yang disimpan.

Letakkan rute "recipes/new/" di atas "recipes/<slug:slug>/". Django menggunakan rute pertama yang cocok. new adalah slug yang valid, jadi rute slug yang diletakkan di atas rute ini akan menangkap /recipes/new/ dan merespons dengan 404.

challenge icon

Tantangan

Sedang

Buat halaman di balik Post a job dengan templat siap pakai jobs/job_form.html.

  1. Di jobs/views.py, tambahkan JobCreateView, sebuah CreateView untuk Job dengan field title, company, city, salary, dan description.
  2. Di jobs/urls.py, tambahkan rute "jobs/new/" bernama create.

Post a job: data tersimpan, lalu Django berhenti dengan No URL to redirect to, yang akan diperbaiki di pelajaran berikutnya.

Coba sendiri

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

Semua pelajaran di View Berbasis Class

Latihan sendiri: Playground Django