Django का उपयोग करके वर्तमान url नाम कैसे प्राप्त करें?


91

मुझे वर्तमान url के अनुसार एक url का निर्माण गतिशील रूप से करना है। {% url %}टैग का उपयोग करना सबसे आसान तरीका है, लेकिन मुझे नए को गतिशील रूप से उत्पन्न करने के लिए वर्तमान यूआरएल नाम की आवश्यकता है।

मैं उस urlconf से जुड़ा url नाम कैसे प्राप्त कर सकता हूं जो वर्तमान दृश्य को ले जाता है?

संपादित करें: मुझे पता है कि मैं मैन्युअल रूप से url को हैंडीक्राफ्ट कर सकता get_absolute_urlहूं, लेकिन मैं इससे बचना चाहूंगा क्योंकि यह एक व्याख्यान का हिस्सा है और मैं url बनाने के लिए केवल एक ही तरीका दिखाना चाहूंगा।

छात्रों को पता है कि कैसे उपयोग करना है {% url %}। वे जानते हैं कि एक समस्या का सामना करना पड़ रहा है जब उन्हें वर्तमान के आधार पर अधिक पूर्ण यूआरएल उत्पन्न करना होगा। सबसे आसान तरीका {% url %}कुछ बदलावों के साथ, फिर से उपयोग करना है। चूँकि हमने url का नाम रखा है, इसलिए हमें यह जानना होगा कि वर्तमान दृश्य कहे जाने वाले url का नाम कैसे पड़ा।

EDIT 2: बेस टेम्प्लेट के आधार पर डिफरेंशियल तरीके से बेस टेम्प्लेट के हिस्सों को प्रदर्शित करने के लिए एक अन्य उपयोग का मामला है। इसे करने के अन्य तरीके हैं (सीएसएस और {% ब्लॉक%} का उपयोग करते हुए), लेकिन कभी-कभी यह अच्छा होता है कि आधार का मेनू प्रविष्टि के टैग को हटाने में सक्षम हो अगर व्यूनेम लिंक से मेल खाता है।


6
मैं एक टेम्पलेट टैग के माध्यम से वर्तमान, पूर्ण यूआरएल को आउटपुट करने के तरीके की खोज करते हुए इस प्रश्न को ढूंढता रहा ... यदि आप भी उसी के लिए देख रहे हैं, तो यह है:{{ request.get_full_path }}
Dolph

जवाबों:


134

मुझे नहीं पता कि यह सुविधा कब तक 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

क्यों? जहाँ तक मैंने आपके प्रश्न को समझा है, इसका एक महत्वपूर्ण हिस्सा यह था कि कैसे प्राप्त किया जाए "चूँकि हमने url का नाम लिया है, हमें यह जानने की आवश्यकता है कि url का नाम कैसे प्राप्त किया जाए जिसे वर्तमान दृश्य कहा जाता है।" ...
Lukas

1
वास्तव में लुकास मैं उस दिन गदगद था और आपके जवाब को पूरी तरह से मनमाने ढंग से त्याग दिया। मैं माफी मांगता हूं, क्योंकि यह वास्तव में सही जवाब है। मैं इसे और अधिक स्पष्ट करने के लिए इसे संपादित करने जा रहा हूँ।
ई-सतीस

8
resolve()यदि आप इसे एक क्वेरी स्ट्रिंग पास नहीं करते हैं और केवल 404 उठाते हैं तो हल नहीं कर सकता get_full_path()। पथ और क्वेरी स्ट्रिंग लौटाता है। आपको उपयोग करने की आवश्यकता होगी resolve(request.path_info)
कर सकते हैं Burak 10ilingir

क्या होगा अगर यह currentयूआरएल नहीं है जिसे हल किया जाना है, लेकिन, कहते हैं, एक उपयोगकर्ता जिस पर पुनर्निर्देशित होने जा रहा है? इसे पूरा करने के लिए और अधिक सामान्य तरीका क्या है? कॉनले ओवेन्स के जवाब में एक सुराग है, लेकिन अगर पहिया कहा जाता है कि पहले से ही Django में हुड के नीचे मौजूद है, तो मैं पहिया को सुदृढ़ नहीं करूंगा।
हसन बेग

यह i18n_patterns के साथ अनुवाद योग्य यूआरएल के लिए काम करने के लिए प्रतीत नहीं होता है
गिनी

109

Django 1.5 के रूप में, यह अनुरोध ऑब्जेक्ट से पहुँचा जा सकता है

    current_url = request.resolver_match.url_name

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


जब मैंने इसे एक संदर्भ प्रोसेसर में रखा तो यह काम कर गया, लेकिन इस अजीब त्रुटि को कंसोल में दिखाया गया था:AttributeError: 'WSGIRequest' object has no attribute 'resolver_match'
fjsj

2
सभी अनुरोध मिडिलवेयर को कॉल करने के बाद ही 'resolver_match' को अनुरोध ऑब्जेक्ट में जोड़ा जाता है। वह तब है जब उरोजों का समाधान हो रहा है। इसलिए आप केवल व्यू मिडलवेयर से ही आगे की ओर पहुँच सकते हैं। (मिडिलवेयर के प्रोसेस_व्यू कार्य)। यह अनुरोध मिडलवेयर फ़ंक्शंस में उपलब्ध नहीं होगा। (process_request फ़ंक्शंस ऑफ़ मिडलवेयर)।
भरतवाज

.view_nameयदि आपको नामस्थान की आवश्यकता है

28

उन लोगों के लिए जो अपने url प्रतिमानों को नामांकित करते हैं, तो आप अनुरोध के नामस्थान url नाम में रुचि ले सकते हैं। इस मामले में, Django ने इसके view_nameबजाय इसे बुलाया ।

request.resolver_match.view_name

# return: <namespace>:<url name>

धन्यवाद, लेकिन यह @ dariusz-niespodziany के पहले जवाब का एक बहुत अधिक है, है ना? stackoverflow.com/a/31931833/1450294
माइकल शीपर

5
यदि आपने अपना नाम स्थान नहीं दिया है urls.pyतो @ dariusz-niespodziany तुरंत -able है reverse। लेकिन अगर आप नाम स्थान का उपयोग कर रहे हैं, तो resolver_match.url_nameसीधे - योग्य नहीं है reverse। इस प्रकार आपको स्वयं नामस्थान को जोड़ना होगा। इसलिए, इसे स्वयं करने के बजाय, Django ने पहले ही .view_nameप्रारंभ पर सेट कर दिया।
यो

15

इसके माध्यम से प्राप्त किया जा सकता है:

    request.resolver_match.url_name

Django> 1.8


4

प्रश्न का स्पष्टीकरण: "एक दृश्य में, आपको एक urlpattern का नाम कैसे मिलता है जो इसे इंगित करता है, यह मानते हुए कि वास्तव में एक ऐसा urlpattern है।"

यह बताए गए कारणों के लिए वांछनीय हो सकता है: दृश्य के भीतर से, हम उसी दृश्य को एक url प्राप्त करने का एक DRY तरीका चाहते हैं (हम अपने स्वयं के urlpattern नाम को जानना नहीं चाहते हैं)।

संक्षिप्त उत्तर: यह वास्तव में आपकी कक्षा को पढ़ाने के लिए पर्याप्त सरल नहीं है, लेकिन आपके लिए एक या दो घंटे में एक मजेदार चीज हो सकती है और गिटहब पर फेंक सकती है।

यदि आप वास्तव में ऐसा करना चाहते हैं, तो आपको दृश्य और कीवर्ड / मान युग्मों के बजाय मिलान किए गए पैटर्न (जिससे आप पैटर्न नाम प्राप्त कर सकते हैं) को वापस करने के लिए RegexURLResolver को उप-करने और रिज़ॉल्यूशन विधि को संशोधित करना होगा। http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142

आप तब एक डेकोरेटर या शायद अधिक उपयुक्त रूप से मिडलवेयर बना सकते हैं जो इस उपवर्ग का उपयोग करता है पैटर्न नाम पाने के लिए और उस मूल्य को कहीं अनुरोध में संग्रहीत करता है ताकि विचार इसका उपयोग कर सकें।

अगर आप वास्तव में ऐसा करना चाहते हैं और आप किसी परेशानी में हैं, तो मुझे बताएं और मैं शायद मदद कर सकता हूं।

आपकी कक्षा के लिए, मैं उन्हें केवल व्यू या टेम्प्लेट में पैटर्न नाम को हार्डकोड करूँगा। मेरा मानना ​​है कि यह करने का स्वीकार्य तरीका है।

अद्यतन: मैं इस बारे में जितना सोचता हूं, उतना अधिक मैं एक दृश्य में एक urlpattern नाम प्राप्त करने की कोशिश कर रहा हूं। urlpattern पैरामीटर उस बिंदु के मापदंडों से काफी स्वतंत्र हैं जो वे इंगित करते हैं। यदि आप एक निश्चित url को इंगित करना चाहते हैं, तो आपको यह जानना होगा कि urlpattern कैसे कार्य करता है, न कि यह कि दृश्य कैसे कार्य करता है। यदि आपको यह जानने की आवश्यकता है कि urlpattern कैसे काम करता है, तो आपको urlpattern का नाम भी जानना होगा।




1

यह आपके प्रश्न से थोड़ा अस्पष्ट है, लेकिन http://docs.djangoproject.com/en/dev/topics/http/urls/ संभवतः आपके द्वारा बताए गए विवरण को प्रदान करेगा।

विशेष रूप से उपयोगी ध्यान दें कि Django प्रक्रियाएं कैसे अनुरोध करती हैं:

जब कोई उपयोगकर्ता आपके Django- संचालित साइट से एक पेज का अनुरोध करता है, तो यह वह एल्गोरिथ्म है जो सिस्टम यह निर्धारित करने के लिए करता है कि पायथन कोड को निष्पादित करने के लिए कौन सा है:

  1. Django उपयोग करने के लिए रूट URLconf मॉड्यूल निर्धारित करता है। आमतौर पर, यह ROOT_URLCONF सेटिंग का मान है, लेकिन यदि आने वाली HttpRequest ऑब्जेक्ट में urlconf (मिडलवेयर अनुरोध प्रसंस्करण द्वारा सेट) नामक एक विशेषता है, तो इसका मान ROOT_URLCONF सेटिंग के स्थान पर उपयोग किया जाएगा।
  2. Django उस पायथन मॉड्यूल को लोड करता है और चर urlpatterns की तलाश करता है। यह पायथन सूची होनी चाहिए, प्रारूप django.conf.urls.defaults.patterns () द्वारा लौटाए गए प्रारूप में।
  3. Django क्रम में प्रत्येक URL पैटर्न के माध्यम से चलता है, और पहले URL पर रुकता है जो अनुरोधित URL से मेल खाता है।
  4. एक बार रेगेक्स मैच होने के बाद, Django दिए गए दृश्य को आयात और कॉल करता है, जो कि एक साधारण पायथन फ़ंक्शन है। यह दृश्य अपने पहले तर्क के रूप में एक HttpRequest पास हो जाता है और शेष तर्कों के रूप में regex में कैप्चर किए गए किसी भी मान।

यदि आप पूर्ण पथ के बाद हैं, तो आप कोशिश कर सकते हैं:

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

मुझे आशा है कि मदद करता है - यह इंगित करता है कि URLconf मॉड्यूल का उपयोग कैसे करें, और उम्मीद है कि यह आपको सही दिशा में इंगित करने में मदद करेगा।


धन्यवाद, लेकिन मुझे पता है कि :-) गलतफहमी से बचने के लिए मैंने कुछ स्पष्टीकरण जोड़े।
ई-सतीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.