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، أي «الطريقة غير مسموح بها»، لذا لا يزيل الرابط أو العنوان المكتوب أي شخص:

@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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس النماذج

تدرّب بنفسك: Playground لـ Django