"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > العمليات CRUD في بايثون و جانغو - الجزء 2

العمليات CRUD في بايثون و جانغو - الجزء 2

تم النشر بتاريخ 2024-07-29
تصفح:979

في مقالتنا السابقة، تناولنا أساسيات إعداد مشروع Django وأنشأنا نموذج التمرين، والذي عرضناه على الواجهة الأمامية كقائمة. في هذه المقالة، سنتعمق في تنفيذ عمليات CRUD. بالنسبة لأولئك غير المألوفين، يشير مصطلح CRUD إلى الإنشاء والقراءة والتحديث والحذف، وهي الإجراءات الأساسية الأربعة التي يمكنك تنفيذها على بياناتك.

الآن بعد أن قمنا بإعداد واجهة برمجة التطبيقات الخاصة بنا في مجلد التطبيق، سنقوم ببساطة بتوسيع عرض الفهرس للتعامل مع طلبات الإنشاء والتحديث والحذف.

الاستمارة

فلنقم بإعداد نموذج يسمح للمستخدمين بإنشاء التمارين. سنستخدم قوالب HTML لهذا الغرض مرة أخرى. للبدء، أنشئ نموذجًا جديدًا باسم add_exercise.html في مجلد التطبيقات/القوالب.

{% csrf_token %}

بعد ذلك، في نموذجنا index.html، سنضمّن النموذج add_exercise.html باستخدام الطريقة التالية:

{% extends "base.html" %} {% block content %}
    

Exercises

{% include 'add_exercise.html' %} ... {% endblock %}

نحن نستخدم علامة التضمين هنا، والتي تعمل على تعزيز قابلية التركيب عبر نماذج HTML، مما يجعل صيانة التعليمات البرمجية وفهمها أسهل. إذا قمت بتحديث الصفحة في متصفحك، فيجب أن ترى النموذج يظهر على الشاشة.

Add Exercise

في HTML، نستخدم علامة

 مع تعيين سمة الطريقة على POST وتشير سمة الإجراء إلى /، وهي نفس نقطة النهاية التي نستخدمها لجلب قائمة التمارين.

في هذا السياق، يعد csrf_token ميزة أمان ممثلة بقيمة سرية يتم إنشاؤها عشوائيًا. فهو يساعد على حماية عمليات إرسال النماذج لدينا من هجمات التزوير، وهو ما يرمز إليه CSRF - تزوير الطلبات عبر المواقع. يتم إنشاء رمز مميز فريد لكل جلسة مستخدم، ولا يمكن الوصول إليه بواسطة مواقع خارجية، وبالتالي منع حدوث تغييرات غير مصرح بها.

يتضمن النموذج حقلي إدخال: أحدهما للعنوان والآخر للتاريخ، باتباع مخطط نموذج التمرين. عند إرسال النموذج، سيتم إرسال قيم العنوان والتاريخ عبر طلب POST إلى نقطة النهاية، والتي ستتم معالجتها بعد ذلك من خلال عرض الفهرس في app/views.py.

الموديل

في Django، يمكننا تحسين نموذج التمرين الخاص بنا - وهو في الأساس فئة Python - عن طريق إضافة طرق محددة تتوافق مع عمليات CRUD. في الملف app/models.py، سندرج ما يلي:

class Exercise(models.Model):
    ...

    def create(request):
        title = request.POST.get('title')
        date = request.POST.get('date')

        exercise = Exercise.objects.create(title=title, date=date)

        return exercise

يمكننا الوصول إلى العنوان والتاريخ من طلب POST، كما هو موضح في الكود أعلاه. بعد ذلك، يمكننا الاستفادة من ORM المدمج في Django لإنشاء تمرين جديد وإرجاع المثيل الذي تم إنشاؤه.

سنستفيد من طريقة عرض الفهرس نفسها التي نستخدمها لاسترداد التمارين، وتوسيعها للتحقق مما إذا كانت طريقة الطلب هي POST. إذا كان الأمر كذلك، فسنمرر كائن الطلب إلى طريقة الفصل التي حددناها مسبقًا. بمجرد إنشاء التمرين، سنعيد توجيه المستخدم مرة أخرى إلى الصفحة الرئيسية أو نقوم بتحديث الصفحة، مما يضمن ظهور التمرين المضاف حديثًا على الشاشة.

from django.http import HttpResponseRedirect

from app import models

...

def index(request):
    if request.method == 'POST':
        models.Exercise.create(request)
        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

حاول إنشاء تمرين جديد الآن، ومن المفترض أن تراه يظهر في أسفل القائمة.

تمرين التحديث

دعونا نعيد بناء الكود الخاص بنا قليلاً قبل إضافة وظيفة التحديث إلى التمارين. سننقل التمارين إلى النموذج الخاص بها المسمىexercise.html.

Exercises

{% include 'add_exercise.html' %}
    {% for exercise in exercises %}
  • {% include 'exercise.html' %}
  • {% endfor %}

قم بإنشاء نموذج لـexercise.html في مجلد التطبيق/القوالب، وسنضيف HTML التالي إليه:

{% csrf_token %}

نحن نستخدم علامة

 مرة أخرى لكل تمرين في القائمة ونضيف مدخلاً مخفيًا لـexercise.id، والذي سيتم استخدامه لتحديث التمرين. ارجع إلى المتصفح وقم بتحديث الصفحة؛ من المفترض أن تشاهد نموذجًا لكل تمرين في القائمة، مع ملء كل إدخال مسبقًا ببيانات التمرين المقابلة.

CRUD Operations In Python & Django - Part 2

لاحظ أننا لا نستخدم PUT كطريقة للنموذج؛ وبدلاً من ذلك، نستخدم POST. وذلك لأن معالجات العرض يمكنها فقط تحليل البيانات المرسلة من خلال طلبات GET وPOST، بدون دعم مضمن لـ PUT وDELETE. عندما أنشأنا طريقة إنشاء الفصل في فصل التمرين، ربما لاحظت أننا استخدمنا request.POST.get('title'). وبينما يعمل هذا مع طلبات POST، لا توجد طرق PUT أو DELETE متاحة في كائن الطلب.

ولكن كيف نفرق بين طلب POST وطلب PUT؟ إذا قمت بفحص النموذج الذي أنشأناه سابقًا، ستلاحظ أننا قمنا بتعيين سمة اسم لزر الإرسال. يمكننا الوصول إلى هذه السمة بنفس الطريقة التي وصلنا بها إلى العنوان والتاريخ، باستخدام request.POST.get('update').

دعونا نقوم بتحديث نموذج تمرين الإنشاء ليشمل نفس التغيير.

...

وفي عرض التدريبات، سنقوم بإجراء التغييرات التالية للتمييز بين الطلبات.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

نتحقق من اسم الزر ونعيد توجيه الطلب إلى طريقة التمرين المناسبة وفقًا لذلك.

دعونا نضيف طريقة فئة التحديث إلى نموذج التمرين في app/models.py.

def update(request):
    id = request.POST.get('id')
    title = request.POST.get('title')
    date = request.POST.get('date')

    exercise = Exercise.objects.filter(pk=id).update(title=title, date=date)

    return exercise

لتحديث صف في قاعدة البيانات، يمكننا استخدام طريقة التحديث المتاحة في نموذج التمرين. ومع ذلك، قبل التحديث، نحتاج إلى التأكد من أننا نقوم بتحديث التمرين الصحيح. وللقيام بذلك، نقوم بتصفية التمارين حسب المفتاح الأساسي، وهو المعرف، ونقوم بتحديث هذا التمرين المحدد فقط.

حذف التمرين

وبالمثل، سنضيف زر حذف بجوار كل تمرين في قالب التمرين.html.

...

سنقوم بتعيين الحذف كقيمة لسمة الاسم، وفي view.py، سنقوم بتوسيع عبارات if...elif للتعامل مع عملية الحذف.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST
        delete = 'delete' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)
        elif delete == True:
            models.Exercise.delete(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

وفي نموذج التمرين، سنضيف طريقة حذف الفصل.

def delete(request):
    id = request.POST.get('id')
    is_deleted = Exercise.objects.filter(pk=id).delete()

    if is_deleted == 1:
        return True

    return False

مع هذه الإضافة، نجحنا في تنفيذ عمليات CRUD في تطبيق Python وDjango الخاص بنا.

الماخذ الرئيسية

  1. لا تدعم معالجات عرض Django طلبات PUT وDELETE، لأنها لا تقوم بتحليل معلمات الاستعلام أو نص الطلب لطرق HTTP تلك. ونتيجة لذلك، يجب علينا الاعتماد على طلبات POST والتفريق بينها عن طريق تمرير حقل إضافي في نص الطلب.
  2. لاحظت أنني أقوم بتقديم طلب POST إلى نفس المسار الذي أقوم بجلب التمارين منه. يعد هذا أمرًا مهمًا لأنه إذا كنت تريد إنشاء نقطة نهاية مثل /api/exercises للتعامل مع الطلبات، فستحتاج إلى إدارة إعادة التوجيه يدويًا. بخلاف ذلك، فإن سلوك علامة
    بعد الطلب هو إعادة توجيه المستخدم إلى نقطة النهاية المحددة في سمة الإجراء. لذلك، ستحتاج إلى إعادة توجيه المستخدم يدويًا مرة أخرى إلى الصفحة المطلوبة، أو في حالتنا، إبقاء المستخدم على نفس الصفحة.
from django.http import HttpResponseRedirect

def index(request):
    ...

    return redirect('/')
    # or
    return HttpResponseRedirect(request.META['HTTP_REFERER'])

باختصار، من خلال إدارة طلبات POST بشكل فعال وضمان إعادة التوجيه المناسبة، يمكننا إنشاء تجربة مستخدم سلسة أثناء تنفيذ عمليات CRUD في تطبيق Django الخاص بنا.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/prvnbist/crud-operations-in-python-django-part-2-4fad?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3