UpdateView
Termasuk bagian View Berbasis Class dalam perjalanan Django di Coddy. Pelajaran 12 dari 18.
Pembuat posting perlu memperbaiki lowongan mereka. Mengedit satu baris berarti membuatnya, hanya saja formulir sudah terisi dan menyimpan perubahan akan mengubah baris tersebut, bukan menambahkan baris baru. UpdateView melakukan keduanya. Situs resep:
class RecipeUpdateView(UpdateView):
model = Recipe
fields = ["title", "cuisine", "minutes"]
# urls.py
path("recipes/<int:pk>/change/", views.RecipeUpdateView.as_view(), name="change")View ini menemukan baris seperti yang dilakukan DetailView, berdasarkan pk atau slug di URL, dan memberikan respons 404 jika tidak ada baris yang cocok. Setelah menyimpan, view ini menuju ke tempat yang dituju CreateView: success_url, atau get_absolute_url() milik baris tersebut.
View ini menggunakan recipes/recipe_form.html bersama CreateView dan menambahkan baris sebagai object, sehingga {% if object %} bernilai true hanya saat mengedit. fields wajib diisi: Django tidak akan menebak field mana yang boleh diubah pengunjung.
Tantangan
MudahHalaman lowongan kerja kini memiliki tautan Edit. Buat halaman di balik tautan itu.
- Di
jobs/views.py, tambahkanJobUpdateView, sebuahUpdateViewuntukJobdengan lima field yang sama sepertiJobCreateView. - Di
jobs/urls.py, tambahkan rute"jobs/<slug:slug>/edit/"bernamaedit.
Buka lowongan kerja, tekan Edit lalu simpan: kamu akan kembali ke halaman lowongan kerja dengan perubahanmu.
Coba sendiri
from django.views.generic import CreateView, 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
class JobCreateView(CreateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
Semua pelajaran di View Berbasis Class
2Tampilan Generik untuk Menampilkan Data
ListViewDetailViewLatihan sendiri: Playground Django