تسمية عناوين URL ومساحات الأسماء في جانغو

تميل الروابط الداخلية للمشروع أو مراجع عناوين URL (على سبيل المثال  <a href='/'>Home Page</a>) إلى أن تكون مشفرة بشكل ثابت، سواء كان ذلك في توابع العرض لإعادة توجيه المستخدمين إلى مواقع معينة أو في القوالب لتوفير تنقل مناسب للمستخدم . يمكن أن تمثل الروابط ذات الترميز الثابت مشكلة صيانة خطيرة مع نمو المشروع، لأنها تؤدي إلى روابط يصعب اكتشافها وإصلاحها. يقدم جانغو طريقة لتسمية عناوين url بحيث يكون من السهل الرجوع إليها في العروض والقوالب.

الطريقة الافضل لتسمية عناوين URL في جانغو هو إضافة سمة name إلى تعريفات عناوين URL في urls.py.

المثال الموالي يوضح كيفية تسمية الصفحة الرئيسية للمشروع، بالإضافة إلى كيفية الإشارة إلى عنوان URL من العرض أو القالب.

path('',TemplateView.as_view(template_name='homepage.html'),name="homepage")
----------------------------------------------------------------------------
# التعريف في العرض
from django.http import HttpResponsePermanentRedirect
from django.urls import reverse

def method(request):
    ....
    return HttpResponsePermanentRedirect(reverse('homepage'))

----------------------------------------------------------------------------
# التعريف في القالب
<a href="{% url 'homepage' %}">Back to home page</a>

قمنا بتعريف عنوان url بإستخدام المسار ” الذي يترجم إلى / أو الصفحة الرئيسية، والمعروف أيضًا باسم الدليل الجذر. فمن خلال تعيين اسم لعنوان url، يمكنك استخدام هذه القيمة كمرجع في العرض والقوالب، مما يعني أن أي تغييرات مستقبلية يتم إجراؤها على مسار عنوان url، تقوم تلقائيًا بتحديث جميع تعريفات عناوين url في العروض والقوالب.

يمكنك رؤية مثال لتابع العرض الذي يعيد توجيه التحكم إلى  reverse('homepage') حيث يحاول البحث عن تعريف عنوان url بالاسم المحدد – في هذه الحالة  homepage – واستبداله وفقًا لذلك. وبالمثل، فإن نموذج الارتباط  <a href="{% url 'homepage' %}">Back to home page</a> يستخدم علامة جانغو {% url %}، التي تحاول البحث عن عنوان url حسب وسيطته الأولى – في هذه الحالة  homepage – واستبدله وفقًا لذلك.

عنوان URL مع الوسائط باستخدام الاسم

تتوفر عملية التسمية والاستبدال نفسها لتعريفات عناوين URL الأكثر تعقيدًا، مثل تلك التي تحتوي على معلمات URL.

#  coffeehouse/urls.py
path(r'^drinks/<str:drink_name>/',TemplateView.as_view(template_name='drinks/index.html'),name="drink"),

----------------------------------------------------------------------------
# التعريف في العرض
from django.http import HttpResponsePermanentRedirect
from django.urls import reverse
def method(request):
    ....
    return HttpResponsePermanentRedirect(reverse('drink', args=(drink.name,)))

----------------------------------------------------------------------------
# التعريف في القالب
<a href="{% url 'drink' drink.name %}">Drink on sale</a>
<a href="{% url 'drink' 'latte' %}">Drink on sale</a>

يستخدم تعريف عنوان url مسارًا أكثر تعقيدًا لعنوان url مع معلمة تترجم إلى عناوين url في النموذج /drinks/latte/  أو  /drinks/espresso/. في هذه الحالة، يتم إعطاء عنوان url اسم الوسيطة  drink_name.

نظرًا لأن عنوان url يستخدم معلمة، فإن بناء جملة التالع reverse و العلامة {% url %} يختلفان قليلاً. حبث يتطلب التابع  reverse توفير معلمات url كصف لمتغير  args وتتطلب العلامة {% url %} توفير وسيطات url كقائمة من القيم. لاحظ في الكود السابق أن المعلمات يمكن أن تكون متغيرات أو قيمًا مشفرة بشكل متساوٍ، طالما أنها تطابق نوع التعبير العادي لوسيطة url – والذي في هذه الحالة ليس أرقامًا.

بالنسبة لتعريفات عناوين url التي تحتوي على أكثر من وسيطة واحدة، فإن أسلوب استخدام reverse و {% url %} متطابق. أما بالنسبة للتابع  reverse، تقوم بتمريرها مصفوفة تحتوي على جميع المعلمات الضرورية، وبالنسبة للعلامة {% url %}، تقوم بتمريرها بقائمة من القيم.

في بعض الأحيان، لا يكون استخدام سمة name في حد ذاته كافيًا لتصنيف عناوين URL. فماذا يحدث إذا كان لديك صفحتين أو ثلاث صفحات فهرس؟ أو إذا كان لديك عنواني URL مؤهلين للحصول على تفاصيل، لكن أحدهما مخصص للمتاجر والآخر للمشروبات؟

يمكنك إستخدام سلسلة من تعريفات عناوين URL التي تستخدم سمة  app_name مع ا include.

# /urls.py
from django.urls import include, path

urlpatterns = [
    path('',TemplateView.as_view(template_name='homepage.html'),name="homepage"),
    path('about/',include('coffeehouse.about.urls')),
    path('stores/',include('coffeehouse.stores.urls')),
]

----------------------------------------------------------------------------
# Contents coffeehouse/about/urls.py
from django.urls import path
from . import views
from . import apps

# apps.AboutConfig.name = coffeehouse.about
app_name = apps.AboutConfig.name

urlpatterns = [
    path('',views.index,name="index"),
    path('contact/',views.contact,name="contact"),
]

----------------------------------------------------------------------------
# Contents coffeehouse/stores/urls.py
from django.urls import path
from . import views
from . import apps

# apps.StoresConfig.name = coffeehouse.stores
app_name = apps.StoresConfig.name

urlpatterns = [
    path('',views.index,name="index"),
    path('<int:store_id>/',views.detail,name="detail"),
)

----------------------------------------------------------------------------
# Definition in views.py file
from django.http import HttpResponsePermanentRedirect
from django.urls import reverse

def method(request):
    ....
    return HttpResponsePermanentRedirect(reverse('coffeehouse.about:index'))

----------------------------------------------------------------------------
# Definition in template
<a href="{% url 'coffeehouse.stores:index' %}">Back to stores index</a>

يبدأ الكود بمجموعة من تعريفات include النموذجية لملف urls.py الرئيسي، مثل تلك التي قمنا بها سابقًا. بعد ذلك، يمكنك رؤية ملفات urls.py المشار إليها في ملف urls.py الرئيسي، والاستفادة من سمة  name الموضحة في المثال السابق. لاحظ أن كلاً من ملفات urls.py الخاصة بالمتاجر والمتاجر تحتوي على عنوان name='index'.

والأهم من ذلك، لاحظ سمة app_name في كل ملف urls.py فرعي. تشير قيمة app_name في كل ملف عنوان url إلى قيمة name المحددة في ملف إعداد apps.py الخاص بالتطبيق. بالنسبة لملف coffeehouse/about/urls.py، قم بتقديم app_name='coffeehouse.about' وبالنسبة coffeehouse/stores/urls.py، قم بتقديم app_name='coffeehouse.stores'. بمساعدة قيمة app_name، يمكنك التمييز بين عنوان name='index' وعنوان url الخاص بالمتاجر الذي يحمل أيضًا name='index'

لتأهيل اسم عنوان url باستخدام app_name، يمكنك استخدام بناء الجملة  <app_name>:<name> للإشارة إلى الفهرس في urls.pyالخاص ب about الذي تستخدمه Coffeehouse.about:index وللإشارة إلى الفهرس في ملف urls.py الخاص بالمتاجر، تستخدم Coffeehouse.stores:index

في 95% من عناوين URL الخاصة بـ Django، يمكنك استخدام معلمات  name و include و app_name تمامًا كما تم وصفها. ومع ذلك، تأخذ المعلمة app_name معنى مختلفًا قليلاً عند نشر مثيلات متعددة لنفس تطبيق Django في نفس المشروع.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading

Scroll to Top