הסרת אורח
חלק מהיחידה טפסים במסלול ה-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):לאחר ביצוע הפעולה, הוסף הודעה ובצע הפניה, כמו קודם.
אתגר
קשההסר אורח.
- ב־
events/urls.py, הוסף אתrsvps/<int:pk>/remove/בשםremove_rsvp. - ב־
events/views.py, כתוב אתremove_rsvpעם@require_POST(מתוךdjango.views.decorators.http). הפונקציה מוחקת את ה־RSVP, מוסיפה את ההודעהAda was removed from the guest list.עם שם האורח, ומפנה לדף האורחים. - ב־
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})
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה טפסים
תרגלו בעצמכם: Django אונליין