اذهب إلى المحتوى

السؤال

نشر

عندما أقرأ كود جانغو Django أحيانًا، أرى في بعض القوالب الدالة reverse. لست متأكدًا تمامًا من ماهية هذه الدالة أو ما تفعله ولكن يتم استخدامها مع الكائن HttpResponseRedirect. كيف ومتى يفترض استخدام دالة reverse في جانغو Django؟

Recommended Posts

  • 2
نشر

لنفترض أنك قمت بتعريف هذا العنوان في عناوين urls.py الخاصة بك:

url(r'^something$', some_view, name='something_name'),

في النموذج ، يمكنك بعد ذلك الرجوع إلى عنوان url هذا من خلال اسمه على النحو التالي:

<!-- django <= 1.4 -->
<a href="{% url something_name %}">رابط إلى some_view</a>

<!-- django >= 1.5 -->
<a href="{% url 'something_name' %}">رابط إلى some_view</a>
<!-- أو كالتالي -->
<a href="% load url from future %}">رابط إلى some_view</a>

سيتم عرض هذا، كالتالي:

<a href="/something/">رابط إلى some_view</a>

لاحظ كيف تم عرض مسار الرابط الكامل.

لنفترض الآن أنك تريد أن تفعل شيئًا مشابهًا في views.py - على سبيل المثال أنت تتعامل مع بعض عناوين URL الأخرى (ليس /something/) في ملف عرض أخر (وليس some_view) وتريد إعادة توجيه المستخدم إلى /something/ (غالبًا ما يحدث عند إرسال نموذج form ناجح). وللقيام بذلك يمكنك إستخدام الكائن HttpResponseRedirect كالتالي:

return HttpResponseRedirect('/something/')

ولكن ماذا لو كنت تريد تغيير عنوان URL في المستقبل؟ يجب عليك تحديث الملف urls.py وجميع المراجع إليه في كل الكود الخاص بالمشروع. وليس من الجيد القيام بذلك لأنه يستغرق الكثير من الوقت وجهد وكذلك يعرض الموقع للأخطاء، والأفضل هو التعديل في مكان واحد فقط. بدلاً من ذلك، يمكنك إستخدام التالي:

from django.urls import reverse
return HttpResponseRedirect(reverse('something_name'))

يبحث هذا في جميع عناوين URL المحددة في مشروعك لعنوان URL المحدد بالاسم something_name ويعيد عنوان URL الفعلي /something/. هذا يعني أنك تشير إلى عنوان URL فقط من خلال اسمه - إذا كنت تريد تغيير عنوان URL نفسه أو ملف العرض الذي يشير إليه، فيمكنك القيام بذلك عن طريق التعديل في مكان واحد فقط وهو الملف urls.py.

كما يمكنك تمرير معاملات إلى رابط URL من خلال الدالة reverse كالتالي:

# URL: /cities/cairo/
return HttpResponseRedirect(reverse('cities', args=('cairo',)))

 

  • 0
نشر

إذا كنت بحاجة إلى استخدام شيء مشابه لسمة "tag" قالب عنوان url ضمن الكود  الخاصة بك، فإن Django يوفر الدالة reverse:

 reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)¶

يمكن أن يكون viewname اسم نمط URL أو كائن عرض قابل للاستدعاء. على سبيل المثال ، بالنظر إلى عنوان url التالي:

from news import views
path('archive/', views.archive, name='news-archive')

يمكنك استخدام أي مما يلي لعكس عنوان URL:

# URL باستخدام اسم عنوان
reverse('news-archive')
# تمرير كائن قابل للاستدعاء
#بهذه الطريقة namespaced هذا غير محبذ لأنه لا يمكنك عكس طرق عرض
from news import views
reverse(views.archive)

إذا كان عنوان URL يقبل الوسطاء، فيمكنك تمريرها في args. على سبيل المثال:

from django.urls import reverse
def myview(request):
    return HttpResponseRedirect(reverse('arch-summary', args=[1945]))

يمكنك أيضاً تمرير kwargs بدلاً من args. على سبيل المثال:

reverse('admin:app_list', kwargs={'app_label': 'auth'})
'/admin/auth/'

لا يمكن تمرير args و kwargs إلى reve5rse في نفس الوقت. إذا تعذر إجراء أي تطابق ، فإن reverse يرمي استثناء NoReverseMatch.
يمكن لوظيفة reverse عكس مجموعة كبيرة ومتنوعة من أنماط التعابير المنتظمة (regex) لعناوين URL ، ولكن ليس كل واحد ممكن.إن القيد الرئيسي في الوقت الحالي هو أن النمط لا يمكن أن يحتوي على خيارات بديلة عن طريق استخدام  ("|").
إذاً يمكنك استخدام هذه الأنماط للمطابقة مع عناوين URL الواردة وإرسالها إلى طرق العرض، ولكن لا يمكنك عكس هذه الأنماط.
تسمح لك الوسيطة current_app بتقديم تلميح "hint" إلى ال reslover يشير إلى التطبيق الذي تنتمي إليه طريقة العرض المنفذة حالياً. يتم استخدام وسيطة current_app كتلميح hint لتحليل  فضاءات أسماء namespaces التطبيقات في عناوين URL، وفقاً ل namespaced URL resolution strategy.
وسيطة urlconf هي وحدة URLconf التي تحتوي على أنماط عنوان URL المراد استخدامها للعكس.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...