2008-09-28 14 views
9

Mam zupełnie nowy projekt Django. Dodałem jedną minimalną funkcję widoku do views.py i jeden wzorzec adresu URL do urls.py, przechodząc na stanowisku poprzez odniesienie funkcji zamiast napisu:Jak pomyślnie przekazać odwołanie do funkcji do funkcji reverse() 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") 

Próbuję użyć reverse() aby uzyskać adres URL, przekazując to odwołanie do funkcji. Ale ja nie dostaję mecz, mimo potwierdzający, że funkcja widok olewam odwrócić jest dokładnie taka sama funkcja widok umieścić w strukturze 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. 

O ile mogę powiedzieć z dokumentacją , odwołania do funkcji powinny być w porządku zarówno w wzorcu adresu URL, jak i reverse().

Używam bagażnik Django, wersja 9092.

Odpowiedz

9

Got it !! Problem polega na tym, że niektóre produkty importowane mają numer myproject.myapp.views, a niektóre z nich to tylko myapp.views. To powoduje mylenie systemu modułów Pythona na tyle, że nie wykrywa już funkcji jako tego samego obiektu. To dlatego, że głównym settings.py prawdopodobnie ma taką linię:

ROOT_URLCONF = `myproject.urls` 

Aby rozwiązać ten problem, spróbuj użyć pełnego importu w sesji powłoki:

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

Oto log z sesji debugowania, dla każdego zainteresowani przyszli czytelnicy:

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

Co się stanie, jeśli zmienisz dopasowanie adresu URL na r'^myview/$'?


Wypróbowałeś go z nazwą widoku? Coś takiego jak reverse ('myapp.myview')?

Czy urls.py jest root URLconf, czy w aplikacji myapp? Musi istnieć pełna ścieżka od katalogu głównego do widoku, który ma zostać rozwiązany. Jeśli to myproject/myapp/urls.py, następnie w myproject/urls.py będziesz potrzebować kodu:

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

Dobre pytanie. Ach, to samo, bez zmian. –

+0

Tak, działa dobrze, jeśli przełączam z odwołań funkcji, aby wyświetlić ciągi znaków w adresie URL conf i 'reverse'. Ale jestem trochę wybredny, staram się tego nie robić :) urls.py to root conf conf. To świeży projekt Django; Edytowałem tylko /urls.py i /myapp/views.py. –

+0

Powiedziawszy to, wydaje mi się, że mogę opuścić mój urlconf za pomocą odwołań funkcji, jeśli przekażę w pełni kwalifikowany ciąg do odwrócenia, to jest odwróć ("myproj.myapp.views.myview"). To chyba wystarczająco dobrze. Może zobaczę otwarcie biletu. –

1

Jeśli dwie pasty kodowe są kompletne, to nie wygląda na sekundę, co sprawia, że ​​faktyczne wezwanie do tyłu() kiedykolwiek zaimportuje moduł adresów URL i tym samym, jeśli mapowanie adresów URL kiedykolwiek zostanie faktycznie osiągnięte.

+0

Próbowałem ponownie sesji powłoki, najpierw zaimportowałem moduł adresów URL i nadal otrzymuję ten sam wynik. Jestem prawie pewien, że mapowanie zostało osiągnięte, ponieważ 'urls.urlpatterns [0] .callback jest views.myview' zwraca true. Zaktualizowano link w pytaniu. –

Powiązane problemy