تميل الروابط الداخلية للمشروع أو مراجع عناوين 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 في نفس المشروع.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.