ویرایش داده – Update


فرآیند ویرایش (Update) داده در جنگو بسیار شبیه به فرآیند ایجاد (Create) است، با این تفاوت که در هنگام نمایش فرم ویرایش، فیلدهای آن از قبل با داده‌های موجود در پایگاه داده پر شده‌اند. این امر به کاربر اجازه می‌دهد تا داده‌های قبلی را مشاده کرده و در صورت نیاز، آن‌ها را تغییر دهد.

برای پیاده‌سازی این عملکرد، نیاز است تا یک شناسه منحصربه‌فرد (مانند id) از رکورد مورد نظر دریافت شود تا بتوان دقیقا همان رکورد را از پایگاه داده بازیابی کرده و در تمپلیت فرم نمایش داد. در جنگو، هر مدل به‌صورت پیش‌فرض یک فیلد id از نوع AutoField دارد که منحصربه‌فرد (unique) و غیرقابل تغییر است — در مدل Project فیلد id از نوع UUIDField تعریف شد — از فیلد id به‌عنوان شناسه داده جهت پیاده‌سازی فرایند ویرایش استفاده خواهیم نمود.

در فایل views.py، یک view با عنوان ProjectUpdate تعریف می‌کنیم که مسئول نمایش فرم ویرایش و ذخیره تغییرات خواهد بود

coreapp/views.py

def ProjectUpdate(request, uid):
    projectObj = models.Project.objects.get(id=uid)
    projectData = forms.ProjectForm(instance=projectObj)

    if request.method == 'POST':
        data = forms.ProjectForm(request.POST, instance=projectObj)
        if data.is_valid():
            data.save()
            return redirect('Projects')
        else:
            projectData = data

    context = { 'form': projectData }
    return render(request, 'forms.html', context)

استفاده از پارامتر instance=projectObj هنگام ایجاد فرم، باعث می‌شود فیلدهای فرم با مقادیر موجود در آن رکورد از پایگاه داده پر شوند. همچنین، هنگام ذخیره‌سازی (data.save())، جنگو به‌جای ایجاد رکورد جدید، همان رکورد قبلی را به‌روزرسانی می‌کند.

 

برای دسترسی به view، باید یک الگوی URL آن را در فایل urls.py تعریف کنیم که شناسه (uid) را به عنوان پارامتر دریافت کند

coreapp/urls.py

urlpatterns = [
    ... ,
    path(project-edit/<str:uid>/', views.ProjectUpdate, name='ProjectUpdate'),
]
  • از <str:uid> استفاده کردیم چون id یک مقدار رشته‌ای تصادفی است. این کار هم امنیت بیشتری فراهم می‌کند و هم از خطاهای نوع داده جلوگیری می‌کند.
  • تعیین عنوان مسیر (name='ProjectUpdate') برای استفاده در تمپلیت‌ها با تگ {% url %} ضروری است.

 

در تمپلیت نمایش جزئیات پروژه (در اینجا read-project.html)، یک لینک ویرایش اضافه می‌کنیم که شناسه پروژه را به مسیر ویرایش منتقل کند.

<a href="{% url 'ProjectUpdate' project.id %}"> Edit Project </a>
  • این لینک، کاربر را به آدرسی همانند /project-edit/550b6632-e552-4ffe-8762-62af20db79ec/ هدایت می‌کند، که در آن view مربوطه، پروژه با id=550b6632-e552-4ffe-8762-62af20db79ec بارگذاری و در فرم نمایش داده می‌شود.
  • تعیین عنوان مسیر (name='ProjectUpdate') برای استفاده در تمپلیت‌ها با تگ {% url %} ضروری است.

 

بدین ترتیب در این فرایند، کاربر به لیست پروژه‌ها (/projects/) رفته و روی عنوان یک پروژه کلیک نموده و به صفحه جزئیات (/read-project/...) منتقل می‌شود. سپس در آنجا، بر روی دکمه "Edit Project" کلیک کرده و به صفحه‌ای با آدرس /project-edit/<id>/ هدایت می‌شود که فرمی با داده‌های فعلی پروژه نمایش داده خواهد شد. در نهایت پس از اعمال تغییرات و ارسال فرم، داده‌ها به‌روزرسانی شده و کاربر به لیست پروژه‌ها بازمی‌گردد.