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 링크가 있습니다. 이 링크가 연결되는 페이지를 다음과 같이 만드세요:

  • 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 플레이그라운드