2008-09-28 12 views
9

Yepyeni bir Django projem var.Bir işlev referansını Django’nun reverse() işlevine başarılı bir şekilde nasıl iletirim?

# 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") 

Ben geçirerek URL'yi almak için reverse() kullanmaya çalışıyorum: Ben yerine bir dize işlevi referans olarak görünümü geçirerek, views.py bir asgari görünüm işlevi ve urls.py bir URL kalıbı ekledik Bu bir işlev referansı. Ben belgelerinden söyleyebilir kadarıyla

>>> 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. 

: Ama ters geçiyorum görünüm işlevi ı URL kalıbı koymak tam aynı görünüm işlevi olduğunu teyit rağmen bir maç almıyorum işlev referansları, hem URL modelinde hem de reverse() öğesinde iyi olmalıdır.

Django bagajı kullanıyorum, revizyon 9092.

cevap

9

Anladım !! Sorun, bazı ithalatların myproject.myapp.views ve bazılarının sadece myapp.views olmasıdır. Bu, Python modül sistemini, aynı nesneler olarak artık işlevleri algılamayacak kadar kafa karıştırıcıdır. settings.py ana muhtemelen gibi bir satır sahip olmasıdır: Bunu çözmek için

ROOT_URLCONF = `myproject.urls` 

, Kabuk oturumda tam alma kullanmayı deneyin: İşte

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

herhangi hata ayıklama oturumu bir günlük var ilgilenen gelecek okuyucular: URL maçı değiştirmek ne olur

>>> 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' 

r'^myview/$' olunur?


Görünüm adıyla denediniz mi? reverse ('myapp.myview') gibi bir şey mi?

urls.py kök URLconf veya myapp uygulamasında mı? Kökten çözülecek bir görünüme kadar tam bir yol olması gerekir.() Sizin iki kod macunlar eksiksiz olması durumunda

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

İyi soru. Ah, aynı şey, değişiklik yok. –

+0

Evet, işlev referanslarından URL conf içindeki isim dizelerini ve tersine çevirmek için değiştirirseniz iyi çalışır. Ama biraz telaşlıyım, bunu yapmamaya çalışıyorum :) urls.py root URL conf. Bu yeni bir Django projesi; Sadece /urls.py ve /myapp/views.py dosyalarını düzenledim. –

+0

Bunu söyledikten sonra, tersine ('myproj.myapp.views.myview') tersine, tam tersine bir dizgeyi geçirirsem, işlev referanslarını kullanarak urlconf'umu bırakabilirim. Bu muhtemelen yeterince iyi. Yine de bir bilet açma hakkında görüşürüz. –

1

, o zaman ters fiili çağrı yapan ikinci, gibi görünmüyor: o myproject/myapp/urls.py ise, o myproject/urls.py içinde böyle bir kod gerekir URL'leri hiç bir zaman gerçekten gerçekleştirirse, url modülünü hiç aktarmaz.

+0

Kabuk oturumunu tekrar denedim, önce URL'leri aldım ve hala aynı sonucu elde ediyorum. 'Urls.urlpatterns [0] .callback' in views.myview 'ifadesinin doğru olmasıyla eşleşmenin sağlandığından eminim. Bağlantıyı söz konusu güncellendi. –

İlgili konular