Menu
CoddyTech

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는 방문자가 어떤 필드를 변경할 수 있는지 추측하지 않습니다.

challenge icon

챌린지

쉬움

이제 채용 공고 페이지에 Edit 링크가 있습니다. 이 링크를 눌렀을 때 표시될 페이지를 만드세요.

  1. jobs/views.py에서 JobUpdateView를 추가하세요. Job의 UpdateView이며, JobCreateView와 동일한 다섯 개 필드를 사용합니다.
  2. jobs/urls.py에서 "jobs/<slug:slug>/edit/" 경로를 추가하고 이름을 edit로 지정하세요.

채용 공고를 열고 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 플레이그라운드