حذف داده – Delete


برای حذف یک رکورد از مدل در جنگو، مطابق روال استاندارد، ابتدا باید یک تابع (view) اختصاصی در فایل views.py ایجاد کنیم. همانند عملیات ویرایش، فرآیند حذف نیز همیشه مربوط به یک رکورد خاص است؛ بنابراین نیاز داریم تا یک شناسهٔ منحصربه‌فرد — معمولا فیلد id — را به‌عنوان پارامتر ورودی دریافت کنیم. این فیلد به‌صورت پیش‌فرض در هر مدل Django وجود دارد، مقدار آن منحصربه‌فرد (unique=True) بوده و پس از ایجاد قابل تغییر نیست.

 

در فایل coreapp/views.py، تابعی به نام ProjectDelete تعریف می‌کنیم که مسئول بازیابی و حذف پروژه مورد نظر از پایگاه داده خواهد بود.

coreapp/views.py

def ProjectDelete(request, uid):
  
projectObj = models.Project.objects.get(id = uid)

  if request.method == 'POST':
    projectObj.delete()
    return redirect('Projects')
  • عملیات حذف فقط در پاسخ به درخواست POST انجام می‌شود تا از حذف تصادفی یا از طریق لینک ساده (مثلا با کلیک یا پیمایش خودکار) جلوگیری شود. 

 

مطابق روال همیشگی، برای دسترسی به view، یک الگوی URL تعریف می‌کنیم که شناسه پروژه (uid) را به‌عنوان پارامتر دریافت کند.

coreapp/urls.py

urlpatterns = [
    ...,
    path('project-delete/<str:uid>/', views.ProjectDelete, name='ProjectDelete'),
]

 

در تمپلیت نمایش جزئیات پروژه (read-project.html)، یک فرم و گزینه حذف تعریف می‌کنیم که با بهره‌گیری از ویژگی action فرم، شناسه پروژه را برای حذف به الگوی مسیر تعریف شده هدایت خواهد کرد.

coreapp/templates/project-read.html

<form action="{% url 'ProjectDelete' project.id %}" method="post">
  {% csrf_token %}
  <button type="submit">Delete</button>
</form>
  • حضور تگ {% csrf_token %} برای جلوگیری از حملات CSRF (Cross-Site Request Forgery) الزامی است. بدون آن، درخواست POST توسط جنگو رد خواهد شد.
  • ویژگی action در تگ <form> مشخص می‌کند که داده‌های فرم (وقتی کاربر روی دکمه type="submit" کلیک می‌کند) به کجا ارسال شوند. در صورتی که آدرسی برای ویژگی action فرم تعیین نشده باشد - action="" - باشد یا وجود نداشته باشد (<form method="post">)، داده‌ها به همان آدرسی که فرم در آن قرار دارد ارسال خواهند شد.

 

فرآیند حذف از دید کاربر به این صورت خواهد بود که، کاربر به لیست پروژه‌ها (/projects/) مراجعه کرده و بر روی عنوان یک پروژه کلیک کرده و به صفحه جزئیات آن (/read-project/...) هدایت می‌شود. در آن صفحه، با انتخاب گزینه حذف «Delete»، یک درخواست POST به آدرس /project-delete/<id>/ ارسال شده و پروژه از پایگاه داده حذف و کاربر به لیست پروژه‌ها بازمی‌گردد.