2008-09-28 9 views
9

मुझे एक नया Django प्रोजेक्ट मिला है। मैं views.py करने के लिए एक न्यूनतम दृश्य समारोह, और urls.py लिए एक URL पैटर्न जोड़ दिया है, एक स्ट्रिंग के बजाय समारोह संदर्भ द्वारा दृश्य गुजर:मैं Django के रिवर्स() फ़ंक्शन के फ़ंक्शन संदर्भ को सफलतापूर्वक कैसे पास करूं?

# urls.py 
# ------- 

# coding=utf-8 

from django.conf.urls.defaults import * 

from myapp import views 


urlpatterns = patterns('', 
    url(r'^myview/$', views.myview), 
) 


# views.py 
---------- 

# coding=utf-8 

from django.http import HttpResponse 


def myview(request): 
    return HttpResponse('MYVIEW LOL', content_type="text/plain") 

मैं, reverse() उपयोग करने के लिए URL प्राप्त करने के कोशिश कर रहा हूँ पारित करके यह एक समारोह संदर्भ है। लेकिन मैं एक मैच नहीं मिल रहा है, इस बात की पुष्टि दृश्य समारोह मैं उल्टा करने के लिए गुजर रहा हूँ ठीक उसी दृश्य समारोह मैं URL पैटर्न में डाल है कि बावजूद: जहाँ तक

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

>>> urls.urlpatterns[0].callback is views.myview 
True 

>>> reverse(views.myview) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/Library/Python/2.5/site-packages/django/core/urlresolvers.py", line 254, in reverse 
    *args, **kwargs))) 
    File "/Library/Python/2.5/site-packages/django/core/urlresolvers.py", line 243, in reverse 
    "arguments '%s' not found." % (lookup_view, args, kwargs)) 
NoReverseMatch: Reverse for '<function myview at 0x6fe6b0>' with arguments '()' and keyword arguments '{}' not found. 

के रूप में मैं प्रलेखन से बता सकते हैं , यूआरएल पैटर्न और reverse() दोनों में फ़ंक्शन संदर्भ ठीक होना चाहिए।

मैं Django ट्रंक उपयोग कर रहा हूँ, संशोधन 9092.

उत्तर

9

मिल गया !! समस्या यह है कि कुछ आयात myproject.myapp.views हैं, और कुछ myapp.views हैं। यह पाइथन मॉड्यूल सिस्टम को भ्रमित कर रहा है कि यह अब एक ही ऑब्जेक्ट के रूप में कार्यों का पता लगाता है। इसका कारण यह है अपने मुख्य settings.py शायद की तरह एक लाइन है:

ROOT_URLCONF = `myproject.urls` 

इस का समाधान करने के लिए, अपने खोल सत्र में पूर्ण आयात का उपयोग करके देखें:

>>> from django.core.urlresolvers import reverse 
>>> from myproject.myapp import views 
>>> reverse(views.myview) 
'/myview/' 

यहाँ डिबगिंग सत्र का एक लॉग है, किसी के लिए रुचि भविष्य पाठकों:

>>> from django.core import urlresolvers 
>>> from myapp import myview 
>>> urlresolvers.get_resolver (None).reverse_dict 
{None: ([(u'myview/', [])], 'myview/$'), <function myview at 0x845d17c>: ([(u'myview/', [])], 'myview/$')} 
>>> v1 = urlresolvers.get_resolver (None).reverse_dict.items()[1][0] 
>>> reverse(v1) 
'/myview/' 
>>> v1 is myview 
False 
>>> v1.__module__ 
'testproject.myapp.views' 
>>> myview.__module__ 
'myapp.views' 

यदि आप URL मैच बदल क्या होता है r'^myview/$' होने के लिए?


क्या आपने इसे देखने के नाम से आजमाया है? reverse ('myapp.myview') की तरह कुछ?

urls.py रूट URLconf है, या myapp आवेदन में? इसे हल करने के लिए रूट से एक पूर्ण पथ होना चाहिए। अगर ऐसा myproject/myapp/urls.py है, तो myproject/urls.py में आप इस तरह कोड की आवश्यकता होगी:

from django.conf.urls.defaults import patterns 
urlpatterns = patterns ('', 
    (r'^/', 'myapp.urls'), 
) 
+0

अच्छा सवाल। आह, वही बात, कोई बदलाव नहीं। –

+0

हाँ, अगर मैं यूआरएल conf और 'रिवर्स' में नाम स्ट्रिंग देखने के लिए फ़ंक्शन संदर्भों से स्विच करता हूं तो यह ठीक काम करता है। लेकिन मैं थोड़ा उग्र हो रहा हूं, ऐसा करने की कोशिश नहीं कर रहा हूं :) urls.py रूट यूआरएल conf है। यह एक ताजा Django परियोजना है; मैंने केवल /urls.py और /myapp/views.py संपादित किया है। –

+0

ऐसा कहकर, ऐसा लगता है कि मैं फ़ंक्शन संदर्भों का उपयोग करके अपना urlconf छोड़ सकता हूं, अगर मैं रिवर्स करने के लिए पूरी तरह से योग्य स्ट्रिंग पास करता हूं, यानी रिवर्स ('myproj.myapp.views.myview')। यह शायद काफी अच्छा है। हालांकि टिकट खोलने के बारे में देख सकते हैं। –

1

अपने दो कोड चिपकाता पूरा कर रहे हैं, तो यह दूसरा है, जो उल्टा करने के लिए वास्तविक रूप से कॉल की तरह नहीं दिखता(), कभी यूआरएल मॉड्यूल आयात करता है और अगर यूआरएल मानचित्रण वास्तव में हासिल किया जाता है।

+0

मैंने पहले शेल सत्र की कोशिश की है, पहले यूआरएल मॉड्यूल आयात कर रहा हूं, और मुझे अभी भी वही परिणाम मिल रहा है। मुझे यकीन है कि मैपिंग हासिल की जा रही है, जैसे 'urls.urlpatterns [0]। कॉलबैक विचार है। मेरादृश्य सही है। प्रश्न में लिंक अपडेट किया गया। –

संबंधित मुद्दे

 संबंधित मुद्दे