Menu
CoddyTech

הסרת אורח

חלק מהיחידה טפסים במסלול ה-Django של Coddy. שיעור 20 מתוך 20.

המארגן צריך להסיר אנשים מדף האורחים. לכל שורה יש טופס קטן משלה שה־action שלו הוא כתובת URL של אותה שורה, כך שלחיצה על כפתור שולחת נתונים רק עבור השורה שלו. רשימת מטלות עם כפתור «בוצע» לכל משימה:

{% 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 %}

תצוגה כמו finish לא מציגה דף: היא משנה נתונים ומבצעת הפניה. @require_POST, מתוך django.views.decorators.http, מסרב לכל בקשה אחרת עם השגיאה 405 Method Not Allowed, כך שקישור או הקלדת כתובת לעולם לא יסירו אף אחד:

@require_POST
def finish(request, pk):

לאחר ביצוע הפעולה, הוסף הודעה ובצע הפניה, כמו קודם.

challenge icon

אתגר

קשה

הסר אורח.

  1. ב־events/urls.py, הוסף את rsvps/<int:pk>/remove/ בשם remove_rsvp.
  2. ב־events/views.py, כתוב את remove_rsvp עם @require_POST (מתוך django.views.decorators.http). הפונקציה מוחקת את ה־RSVP, מוסיפה את ההודעה Ada was removed from the guest list. עם שם האורח, ומפנה לדף האורחים.
  3. ב־guest_list.html, הוסף לכל אורח טופס POST עם {% csrf_token %} וכפתור Remove ששולח את הטופס לכתובת ה־URL שלו.

הסר את Ada: נשארה רק Grace.

נסו בעצמכם

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 iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה טפסים

תרגלו בעצמכם: Django אונליין