Menu
CoddyTech

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 de su fila. Una lista de tareas con un botón Done 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 tiene página: solo realiza una acción. @require_POST de django.views.decorators.http responde con 405 a cualquier otro método antes de que se ejecute la vista, 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.

challenge icon

Desafío

Difícil
  • En la página de invitados, cada invitado tiene un botón Remove que envía una solicitud POST a /rsvps/<pk>/remove/ (nombre de URL remove_rsvp).
  • Esa vista solo acepta solicitudes POST. Elimina la RSVP, añade Ada was removed from the guest list. con el nombre del invitado y redirige a la página de invitados del evento.

Pulsa Run y elimina a un invitado.

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})
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Formularios

Practica por tu cuenta: Playground de Django