Как мне успешно передать ссылку на функцию reverse () в Django? - PullRequest
10 голосов
/ 28 сентября 2008

У меня новый проект Django. Я добавил одну минимальную функцию представления в views.py и один шаблон URL в urls.py, передавая представление по ссылке на функцию вместо строки:

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

Насколько я могу судить из документации, ссылки на функции должны быть хорошими как в шаблоне URL, так и в reverse().

Я использую ствол Django, ревизия 9092.

Ответы [ 2 ]

10 голосов
/ 28 сентября 2008

Понял !! Проблема в том, что некоторые из них имеют myproject.myapp.views, а некоторые просто myapp.views. Это сбивает с толку систему модулей Python настолько, что она больше не определяет функции как один и тот же объект. Это потому, что ваш основной 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'),
)
1 голос
/ 28 сентября 2008

Если ваши две вставки кода завершены, то это не похоже на вторую, которая вызывает фактический вызов reverse (), когда-либо импортирует модуль urls и, следовательно, если сопоставление url когда-либо действительно достигается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...