كيف تحصل على اسم عنوان URL الحالي باستخدام Django؟

StackOverflow https://stackoverflow.com/questions/2491605

  •  21-09-2019
  •  | 
  •  

سؤال

لا بد لي من بناء عنوان URL ديناميكيًا وفقًا لعنوان URL الحالي. باستخدام {% url %} العلامة هي أسهل طريقة للقيام بذلك ، لكنني أحتاج إلى اسم عنوان URL الحالي لإنشاء اسم جديد ديناميكيًا.

كيف يمكنني إرفاق اسم عنوان URL بعنوان URLCONF الذي يؤدي إلى العرض الحالي؟

تحرير: أعلم أنه يمكنني يدويًا يدويًا عنوان URL باستخدام get_absolute_url لكنني أفضل تجنب ذلك لأنه جزء من محاضرة وأرغب في إظهار طريقة واحدة فقط لبناء عناوين URL.

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

تحرير 2: حالة الاستخدام الأخرى هي عرض أجزاء من القالب الأساسي بشكل مختلف وفقًا للقالب الأساسي. هناك طرق أخرى للقيام بذلك (باستخدام CSS و {٪ block ٪} ، ولكن في وقت ما ، من الجيد أن تكون قادرًا على إزالة علامة إدخال القائمة لـ base.html إذا كان اسم ViewName يطابق الرابط.

هل كانت مفيدة؟

المحلول

لا أعرف كم من الوقت كانت هذه الميزة جزءًا من Django ولكن كما المقالة التالية العروض ، يمكن تحقيقها على النحو التالي في العرض:

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

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

تحرير: تطبيق تحديث Django الجديد

بعد تحديث Django الحالي:

Django 1.10 (حلقة الوصل)

استيراد من django.core.urlresolvers تم إهمال الوحدة النمطية لصالح موقعها الجديد ، django.urls

Django 2.0 (حلقة الوصل)

ال django.core.urlresolvers تتم إزالة الوحدة النمطية لصالح موقعها الجديد ، django.urls.

وبالتالي ، فإن الطريقة الصحيحة للقيام بها هي مثل هذا:

from django.urls import resolve
current_url = resolve(request.path_info).url_name

نصائح أخرى

اعتبارًا من Django 1.5 ، يمكن الوصول إلى هذا من كائن الطلب

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.httprequest.resolver_match

بالنسبة لأولئك الذين يسميون أنماط عناوين URL الخاصة بهم ، قد تكون مهتمًا باسم عنوان URL المستعار للطلب. في هذه الحالة ، أطلق عليه Django view_name في حين أن.

request.resolver_match.view_name

# return: <namespace>:<url name>

يمكن تحقيق ذلك عبر:

request.resolver_match.url_name

Django> 1.8

توضيح السؤال: "في الرأي ، كيف تحصل على اسم عنوان URLPattern الذي يشير إليه ، على افتراض أن هناك عن urlpattern بالضبط."

قد يكون هذا أمرًا مرغوبًا فيه للأسباب المذكورة: من داخل العرض ، نريد طريقة جافة للحصول على عنوان URL لنفس العرض (لا نريد أن نعرف اسم عنوان URLPattern الخاص بنا).

إجابة قصيرة: ليس الأمر بسيطًا بما يكفي لتعليم صفك ، ولكن قد يكون من الممتع أن تفعل في غضون ساعة أو ساعتين ورمي جيثب.

إذا كنت ترغب حقًا في القيام بذلك ، فسيتعين عليك إعادة الفئة الفرعية لإعادة الفئة الفرعية وتعديل طريقة الحل لإرجاع النمط المتطابق (الذي يمكنك الحصول عليه من اسم النمط) بدلاً من أزواج العرض والكلمة الرئيسية.http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#l142

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

إذا كنت ترغب بالفعل في القيام بذلك وترشح بعض المشاكل ، فأخبرني وربما يمكنني المساعدة.

بالنسبة لفصلك ، أود فقط أن أجعلهم متشددين اسم النمط في العرض أو القالب. أعتقد أن هذه هي الطريقة المقبولة للقيام بذلك.

تحديث:كلما فكرت في هذا الأمر ، كلما زاد تثبيط محاولة الحصول على اسم urlpattern في عرض. معلمات urlpattern مستقلة إلى حد ما عن معلمات الرأي الذي يشيرون إليه. إذا كنت ترغب في الإشارة إلى عنوان URL معين ، فأنت بحاجة إلى معرفة كيفية عمل urlpattern ، وليس فقط كيفية عمل العرض. إذا كنت بحاجة إلى معرفة كيفية عمل urlpattern ، فقد يتعين عليك أيضًا معرفة اسم urlpattern.

إنه غير واضح بعض الشيء من سؤالك ، لكن http://docs.djangoproject.com/en/dev/topics/http/urls/ من المحتمل أن تقدم شرحًا لما أنت بعده.

من المفيد بشكل خاص ملاحظة كيفية قيام Django بمعالجة الطلبات:

عندما يطلب المستخدم صفحة من موقعك الذي يعمل بنظام Django ، فهذه هي الخوارزمية التي يتبعها النظام لتحديد رمز Python الذي سيتم تنفيذه:

  1. يحدد Django وحدة URLCONF الجذر للاستخدام. عادة ، هذه هي قيمة إعداد ROUT_URLCONF ، ولكن إذا كان كائن HTTPREQUEST الوارد يحتوي على سمة تسمى urlconf (تم تعيينها بواسطة معالجة طلب الودودة المتوسطة) ، فسيتم استخدام قيمته بدلاً من إعداد ROOT_URLCONF.
  2. يحمل Django أن وحدة Python وتبحث عن urlpatterns المتغيرة. يجب أن تكون هذه قائمة Python ، بالتنسيق الذي تم إرجاعه بواسطة الدالة django.conf.urls.defaults.patterns ().
  3. يمر Django عبر كل نمط عنوان URL ، بالترتيب ، ويتوقف عند أول نظام يطابق عنوان URL المطلوب.
  4. بمجرد أن تتطابق أحد regexes ، يستورد Django ويطلق على العرض المحدد ، وهي وظيفة Python بسيطة. يتم تمرير العرض httprequest كوسيطة لها وأي قيم تم التقاطها في Regex كوسيطات متبقية.

إذا كنت بعد المسار الكامل ، يمكنك المحاولة:

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.httprequest.get_full_path

آمل أن يساعد ذلك - إنه يشير إلى كيفية استخدام وحدة URLCONF ، ونأمل أن تساعدك في توجيهك في الاتجاه الصحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top