Menu
CoddyTech

Editando um evento

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

Agora, cada página de evento 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 é com você.

Um ModelForm edita uma linha existente quando você passa essa linha como instance. Para uma nota em um aplicativo de notas:

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, sem adicionar 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 esquecer no POST, salvar adicionará uma cópia.

challenge icon

Desafio

Fácil

Conclua edit_event em events/views.py:

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

O modelo precisa de form e event. Clique em Executar e, em seguida, clique em Edit this event.

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