13

我有一个全新的 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。但是我没有得到匹配,尽管我确认我传递给 reverse 的视图函数与我在 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。

4

2 回答 2

11

知道了!!问题是有些进口是 的myproject.myapp.views,有些只是 的myapp.views。这使 Python 模块系统非常混乱,以至于它不再将函数检测为同一个对象。这是因为您的 mainsettings.py可能有如下一行:

ROOT_URLCONF = `myproject.urls`

要解决此问题,请尝试在您的 shell 会话中使用完全导入:

>>> 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'),
)
于 2008-09-28T19:17:44.470 回答
1

如果您的两个代码粘贴已完成,那么它看起来不像第二个,它会实际调用 reverse(),导入 urls 模块,因此如果实际实现了 url 映射。

于 2008-09-28T19:25:49.380 回答