Menu
CoddyTech

Editando um evento

Parte da seção Forms do Journey de Django da Coddy. Lição 13 de 20.

Cada página de evento agora tem um link Editar este evento para /events/1/edit/. A URL, o link e o template estão prontos, e edit_event já encontra o evento indicado pela URL. O restante da view é por sua conta.

Um ModelForm edita uma linha existente quando você passa essa linha como instance. Para uma anotação em um aplicativo de anotações:

note = get_object_or_404(Note, pk=4)

form = NoteForm(instance=note)                # preenchido com os valores da nota

form = NoteForm(request.POST, instance=note)  # os novos valores para esta nota
if form.is_valid():
    form.save()                               # atualiza a nota 4, não adiciona nenhuma linha

Sem dados, NoteForm(instance=note) exibe o formulário preenchido com os valores atuais da linha. Com dados, instance=note faz com que form.save() atualize essa linha em vez de criar uma nova.

Uma página de edição precisa dos dois. Se você esquecer a instância no GET, o visitante verá um formulário vazio; se esquecê-la no POST, salvar adicionará uma cópia.

challenge icon

Desafio

Fácil

Conclua edit_event em events/views.py substituindo o comentário. O render() no final já passa event; adicione form ao lado dele.

  • Uma requisição GET exibe o formulário preenchido com os detalhes do evento.
  • Uma requisição POST válida salva as alterações, não adiciona nenhum evento novo e redireciona para a página dele.
  • Uma requisição POST inválida exibe a página novamente com os erros.

Altere Place para Town Hall e pressione Save changes: a página do evento exibirá Town Hall.

Experimente você mesmo

from django.shortcuts import get_object_or_404, redirect, render

from .forms import EventForm
from .models import Event


def event_list(request):
    q = request.GET.get("q", "")
    events = Event.objects.all()
    if q:
        events = events.filter(title__icontains=q)
    return render(request, "events/event_list.html", {"events": events, "q": q})


def event_detail(request, pk):
    event = get_object_or_404(Event, pk=pk)
    return render(request, "events/event_detail.html", {"event": event})


def new_event(request):
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save()
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm()
    return render(request, "events/new_event.html", {"form": form})


def edit_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    # Crie o formulário para este evento, valide-o e salve-o, como em new_event.
    return render(request, "events/edit_event.html", {"event": event})
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Forms

Pratique por conta própria: Playground de Django