Menu
CoddyTech

UpdateView

Parte da seção Views baseadas em classes do Journey de Django da Coddy. Lição 12 de 18.

Quem publica precisa corrigir seus anúncios de vagas. Editar uma linha é criar uma, exceto que o formulário começa preenchido e, ao salvar, altera a linha em vez de adicionar uma. UpdateView faz as duas coisas. Um site de receitas:

class RecipeUpdateView(UpdateView):
    model = Recipe
    fields = ["title", "cuisine", "minutes"]


# urls.py
path("recipes/<int:pk>/change/", views.RecipeUpdateView.as_view(), name="change")

Ele encontra a linha da mesma forma que DetailView, usando o pk ou o slug na URL, e responde com 404 quando não há nenhuma. Depois de salvar, ele leva para o mesmo lugar que CreateView: success_url ou o get_absolute_url() da linha.

Ele compartilha recipes/recipe_form.html com CreateView e adiciona a linha como object, então {% if object %} é verdadeiro somente ao editar. fields é obrigatório: o Django não vai adivinhar quais campos um visitante pode alterar.

challenge icon

Desafio

Fácil

As páginas de vagas agora têm um link Edit. Crie a página acessada por ele:

  • Uma JobUpdateView, uma UpdateView de Job com os mesmos cinco campos de JobCreateView.
  • Uma rota "jobs/<slug:slug>/edit/" chamada edit.

Pressione Run, abra uma vaga, pressione Edit e salve: você voltará à vaga com sua alteração.

Experimente você mesmo

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"]

Todas as lições de Views baseadas em classes

Pratique por conta própria: Playground de Django