2008-09-25 6 views
8

मेरी urls.py फ़ाइल में, मेरे पास है:मैं नामित यूआरएल पैटर्न के बजाय फ़ंक्शन संदर्भ के साथ django.core.urlresolvers.reverse का उपयोग कैसे करूं?

from myapp import views 
... 
(r'^categories/$', views.categories) 

कहाँ categoriesmyapp/views.py अंदर एक दृश्य के कार्य है। कोई अन्य URLconf लाइन संदर्भ views.categories

एक यूनिट परीक्षण फ़ाइल में, मैं केवल '/ श्रेणियां /' (डीआरवाई और वह सब) की प्रतिलिपि बनाने के बजाय django.core.urlresolvers.reverse() का उपयोग करके इस यूआरएल को पकड़ने की कोशिश कर रहा हूं। तो, मेरे पास है:

from django.core.urlresolvers import reverse 
from myapp import views 
... 

url = reverse(views.categories) 

जब मैं अपने परीक्षण चलाने के लिए, मैं एक NoReverseMatch त्रुटि मिलती है:

NoReverseMatch: Reverse for '<function categories at 0x1082f30>' with arguments '()' and keyword arguments '{}' not found. 

अगर मैं URL पैटर्न एक नामित पैटर्न बनाने के लिए, इस तरह यह सिर्फ ठीक से मेल खाता है:

url(r'^categories/$', views.categories, 'myapp-categories') 

और यह मैच के लिए पैटर्न नाम का उपयोग करें:

url = reverse('myapp-categories') 

लेकिन जहां तक ​​मैं the reverse documentation से बता सकता हूं, मुझे इसे reverse का उपयोग करने के लिए नामित यूआरएल पैटर्न बनाने की आवश्यकता नहीं है।

कोई विचार क्या मैं गलत कर रहा हूं?

+0

रिवर्स प्रलेखन कहता है कि आपको नामित यूआरएल का उपयोग करने या अपने यूआरएल कॉन्फ़िगर में इस्तेमाल किए गए फ़ंक्शन का नाम पास करने की आवश्यकता है, और इसे स्ट्रिंग के रूप में पारित किया जा सकता है।तो या तो इसे एक नामित यूआरएल बनाएं या "views.categories" का प्रयोग करें। – camflan

+0

नवीनतम दस्तावेज का कहना है कि दृश्य नाम "या तो एक फ़ंक्शन संदर्भ, या नाम का स्ट्रिंग संस्करण" है, इसलिए इसे स्ट्रिंग होने की आवश्यकता नहीं है:

उत्तर

2

आगे जांच के बाद पता चला है कि यह कैसे मैं विचारों मॉड्यूल आयात करने गया था के साथ एक मुद्दा था:

How do I successfully pass a function reference to Django’s reverse() function?

मदद के लिए धन्यवाद हालांकि, लोग: क्या आप मुझे इस पर गौर करने के लिए प्रेरित अच्छी तरह।

-1

रिवर्स फ़ंक्शन वास्तव में यूआरएल के "नाम" का उपयोग करता है। इसे इस प्रकार परिभाषित किया गया है:

urlpatterns = patterns('', 
    (r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"), 
    (r'^admin/(.*)', admin.site.root), 
) 

अब आप सही यूआरएल प्राप्त करने के लिए स्ट्रिंग "नो-बंदर" के साथ विपरीत कॉल करेंगे।

निंजा संपादित करें: Here is a link विषय पर django दस्तावेज़ों के लिए।

+0

निश्चित रूप से, अगर मैं नामित यूआरएल पैटर्न का उपयोग करता हूं तो यह ठीक काम करता प्रतीत होता है। लेकिन मुझे लगता है कि इसे सिर्फ एक समारोह संदर्भ के साथ काम करना चाहिए। एक साइड नोट के रूप में, मुझे लगता है कि आपको नामित यूआरएल पैटर्न यानी यूआरएल (आर '^ no_monkeys/$', 'views.noMonkeys', {}, "no" बनाने के लिए केवल एक टुपल के बजाय यूआरएल फ़ंक्शन का उपयोग करने की आवश्यकता है। -मोनी ") –

+0

हां, जैसा कि मैंने कहा है, आपको नामित यूआरएल का उपयोग करने के लिए 'url()' फ़ंक्शन को कॉल करने की आवश्यकता है। http://stackoverflow.com/questions/134629/how-do-i-use-djangocoreurlresolversreverse-with-a-function-reference-instead-of#136721 – camflan

+0

और, 'name' एक कीवर्ड तर्क है और इसे हस्ताक्षर किया जाना चाहिए इस तरह के। – camflan

0

यह काम करता है, और आपके द्वारा चिपकाए गए सभी कोड सही हैं और ठीक काम करता है (मैंने इसे एक स्वच्छ परीक्षण/प्रोजेक्ट ऐप में कॉपी किया है और यह बिना किसी समस्या के यूआरएल को उलट देता है)। तो यहां कुछ और चल रहा है कि आपने हमें नहीं दिखाया है। जब तक यह काम नहीं करता तब तक नंगे हड्डियों की मूल बातें को सरल बनाएं, फिर जटिलता को वापस जोड़ना शुरू करें और देखें कि यह कहां टूट रहा है।

इसके अलावा, आप "./manage.py खोल" कर सकते हैं और फिर रिवर्स फ़ंक्शन और आपके व्यू फ़ंक्शन को इंटरैक्टिव रूप से आयात कर सकते हैं और रिवर्स को आजमा सकते हैं। यह एक संभावित कारण के रूप में परीक्षण सेटअप को हटा देगा।

+0

आप बिल्कुल सही हैं: मैं प्रोग्रामिंग के लिए थोड़ा नया हूं, इसलिए अक्सर मैं इस तरह के उचित समस्या निवारण चरणों को भूल जाता हूं। हालांकि यह अजीब बात है, मैंने एक नया, खाली एक-ऐप प्रोजेक्ट बनाया है, जिसमें कोड चिपकाया गया है, और मैं इसे वहां काम नहीं कर सकता। मैं कुछ और खराब कर दूंगा। –

2

जैक एम का उदाहरण लगभग सही है।

यदि आप नामित यूआरएल का उपयोग करना चाहते हैं, तो इसे एक यूआरएल फ़ंक्शन होना चाहिए, न कि टुपल।

url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"), 
संबंधित मुद्दे