إزالة مدعو
جزء من قسم النماذج في رحلة 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 قبل تشغيل دالة العرض، لذا لن يؤدي رابط أو عنوان مكتوب يدويًا إلى إزالة أي شخص:
@require_POST
def finish(request, pk):بعد تنفيذ الإجراء، أضف رسالة وأعِد التوجيه، كما في السابق.
التحدي
صعب- في صفحة الضيوف، يظهر لكل ضيف زر
Removeيرسل طلبًا إلى/rsvps/<pk>/remove/(اسم عنوان URL هوremove_rsvp). - يقبل هذا العرض طلبات POST فقط. ويحذف RSVP، ويضيف
Ada was removed from the guest list.مع اسم الضيف، ثم يعيد التوجيه إلى صفحة ضيوف الفعالية.
اضغط على Run وأزل ضيفًا.
جرّب بنفسك
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})
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس النماذج
تدرّب بنفسك: Playground لـ Django