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 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.

challenge icon

Desafío

Difícil

Eliminar a un invitado.

  1. En events/urls.py, añade rsvps/<int:pk>/remove/ con el nombre remove_rsvp.
  2. En events/views.py, escribe remove_rsvp con @require_POST (de django.views.decorators.http). Elimina la RSVP, añade el mensaje Ada was removed from the guest list. con el nombre del invitado y redirige a la página de invitados.
  3. En guest_list.html, añade a cada invitado un formulario POST con {% csrf_token %} y un botón Remove que 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})
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