UpdateView
Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 12번째.
게시자는 자신의 작업을 수정할 수 있어야 합니다. 행을 편집하는 것은 새 행을 만드는 것과 비슷하지만, 양식이 처음부터 값으로 채워져 있고 저장하면 새 행을 추가하는 대신 기존 행이 변경됩니다. UpdateView는 이 두 가지를 모두 처리합니다. 레시피 사이트의 예입니다.
class RecipeUpdateView(UpdateView):
model = Recipe
fields = ["title", "cuisine", "minutes"]
# urls.py
path("recipes/<int:pk>/change/", views.RecipeUpdateView.as_view(), name="change")DetailView와 같은 방식으로 URL의 pk 또는 slug를 사용해 행을 찾으며, 해당 행이 없으면 404를 반환합니다. 저장한 뒤에는 CreateView와 같은 곳으로 이동합니다. 즉, success_url 또는 해당 행의 get_absolute_url()로 이동합니다.
CreateView와 recipes/recipe_form.html을 공유하고 해당 행을 object로 전달하므로, {% if object %}는 편집 중일 때만 참입니다. fields는 필수입니다. Django는 방문자가 변경할 수 있는 필드를 임의로 추측하지 않습니다.
챌린지
쉬움채용 공고 페이지에 이제 Edit 링크가 있습니다. 이 링크가 연결되는 페이지를 다음과 같이 만드세요:
JobCreateView와 동일한 다섯 필드를 사용하는Job의UpdateView인JobUpdateView.edit라는 이름의"jobs/<slug:slug>/edit/"경로.
Run을 누르고, 채용 공고를 연 다음 Edit를 누르고 저장하세요. 변경 사항이 반영된 채용 공고 페이지로 돌아옵니다.
직접 해보기
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"]
클래스 기반 뷰의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드