Eliminar a un invitado
Parte de la sección Formularios del Journey de Django de Coddy. Lección 20 de 20.
La persona organizadora necesita quitar personas de la página de invitados. Cada fila tiene su propio formulario pequeño cuya action es una URL para esa fila, así que un botón envía datos solo sobre su fila. Una lista de tareas con un botón «Hecho» para cada tarea:
{% for task in tasks %}
<li>
{{ task.title }}
<form method="post" action="{% url 'todo:finish' task.pk %}">
{% csrf_token %}
<button type="submit">Done</button>
</form>
</li>
{% endfor %}Una vista como finish no muestra ninguna página: cambia los datos y redirige. @require_POST, de django.views.decorators.http, rechaza cualquier otra solicitud con el error 405 Method Not Allowed, así que un enlace o una dirección escrita nunca elimina a nadie:
@require_POST
def finish(request, pk):Después de realizar la acción, añade un mensaje y redirige, como antes.
Desafío
DifícilEliminar a un invitado.
- En
events/urls.py, añadersvps/<int:pk>/remove/con el nombreremove_rsvp. - En
events/views.py, escriberemove_rsvpcon@require_POST(dedjango.views.decorators.http). Elimina la RSVP, añade el mensajeAda was removed from the guest list.con el nombre del invitado y redirige a la página de invitados. - En
guest_list.html, añade a cada invitado un formulario POST con{% csrf_token %}y un botónRemoveque envíe los datos a su URL.
Elimina a Ada: solo queda Grace.
Pruébalo tú mismo
from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect, render
from .forms import EventForm, RSVPForm
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)
if request.method == "POST":
form = RSVPForm(request.POST, event=event)
if form.is_valid():
rsvp = form.save(commit=False)
rsvp.event = event
rsvp.save()
messages.success(request, "You're on the list!")
return redirect("events:detail", pk=event.pk)
else:
form = RSVPForm(event=event)
return render(request, "events/event_detail.html", {"event": event, "form": form})
def new_event(request):
if request.method == "POST":
form = EventForm(request.POST)
if form.is_valid():
event = form.save()
messages.success(request, "Your event was added.")
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)
if request.method == "POST":
form = EventForm(request.POST, instance=event)
if form.is_valid():
form.save()
messages.success(request, "Your changes were saved.")
return redirect("events:detail", pk=event.pk)
else:
form = EventForm(instance=event)
return render(request, "events/edit_event.html", {"form": form, "event": event})
def delete_event(request, pk):
event = get_object_or_404(Event, pk=pk)
if request.method == "POST":
event.delete()
messages.success(request, "The event was deleted.")
return redirect("events:list")
return render(request, "events/delete_event.html", {"event": event})
def guest_list(request, pk):
event = get_object_or_404(Event, pk=pk)
return render(request, "events/guest_list.html", {"event": event})
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Formularios
2Formularios de Django
Un formulario de DjangoDibujar un formulario5Proyecto: Lista de invitados
Una confirmación de asistencia por correo electrónicoUna página para invitadosPractica por tu cuenta: Playground de Django