模板 url 标签无法识别 Django 命名的 url
Posted
技术标签:
【中文标题】模板 url 标签无法识别 Django 命名的 url【英文标题】:Django named urls unrecognized by template url tags 【发布时间】:2010-11-08 00:20:26 【问题描述】:在 projects/urls.py 我有:
urlpatterns = patterns('bizteen.projects.views',
url(r'^browse/$', 'browse', name='projects-browse-main'),
url(r'^browse/(\d+)/$', 'browse', name='projects-browse'),
url(r'^create/$', 'create', name='projects-create'),
url(r'^(\d+)/$', 'view_project', name='projects-view'),
)
在一个模板中我有:
<a href="% url projects-browse-main %">Browse projects</a>
但是出现了一个错误。
TemplateSyntaxError at /
Caught an exception while rendering: Reverse for 'bizteen.projects-browse-main' with arguments '()' and keyword arguments '' not found.
我能想到的最多的是名称被视为视图。为什么会这样?
来自 bizteen.projects.views:
from django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect
from bizteen.projects.models import Project, ProjectComment
from django.template import RequestContext
def browse(request, page=0):
page_start = page * 25
page_end = page_start + 25
project_list = Project.objects.order_by('date_created').reverse([page_start:page_end]
return render_to_response('browse_projects.html', 'project_list': project_list, context_instance=RequestContext(request))
和主要的 urls.py:
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^users/', include('bizteen.userthings.urls')),
(r'^projects/', include('bizteen.projects.urls')),
url(r'^$', 'bizteen.userthings.views.home', name='main-home'),
url(r'^profile/$', 'bizteen.userthings.user-profile'),
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/(.*)', admin.site.root),
url(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
'document_root': 'templates/static'),
)
追溯:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/
Django Version: 1.0.2 final
Python Version: 2.5.1
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.admin',
'bizteen.userthings',
'bizteen.projects']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware')
Template error:
In template /Users/xenon/bizteen/trunk/web/bizteen/templates/base.html, error at line 33
Caught an exception while rendering: Reverse for 'bizteen.main-home' with arguments '()' and keyword arguments '' not found.
23 : <div class="span-24">
24 : <div class="span-10"> </div>
25 : <div class="span-8">
26 : <div id='quick_user_menu'>
27 : <b>Hi there!</b>
28 : % if user.is_authenticated %
29 : <b><a href=" user.get_absolute_url "> user.username </a></b>
30 : <a href='/user/home/' class='lightblue'>Dashboard</a> |
31 : (<a href='/user/logout/' class='anchor'>logout</a>)
32 : % else %
33 : <a href=' % url main-home % ' class='lightblue' rel='facebox'>Sign In</a>
34 : (<a href='/user/signup/' class='anchor'>Don't have an account?</a>)
35 :
36 : % endif %
37 : </div>
38 : </div>
39 : </div>
40 : <div class="span-24">
41 : <div id='header'>
42 : <div class="span-8">
43 : <A href='/user/home/'><img src='http://localhost:8000/site_media/images/logo.png' alt='BizTeen logo image' align='left'/></a>
Traceback:
File "/Library/Python/2.5/site-packages/django/core/handlers/base.py" in get_response
86. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/xenon/bizteen/trunk/web/bizteen/../bizteen/userthings/views.py" in home
29. return render_to_response('home.html', context_instance=RequestContext(request))
File "/Library/Python/2.5/site-packages/django/shortcuts/__init__.py" in render_to_response
18. return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/Library/Python/2.5/site-packages/django/template/loader.py" in render_to_string
107. return t.render(context_instance)
File "/Library/Python/2.5/site-packages/django/template/__init__.py" in render
176. return self.nodelist.render(context)
File "/Library/Python/2.5/site-packages/django/template/__init__.py" in render
768. bits.append(self.render_node(node, context))
File "/Library/Python/2.5/site-packages/django/template/debug.py" in render_node
71. result = node.render(context)
File "/Library/Python/2.5/site-packages/django/template/loader_tags.py" in render
97. return compiled_parent.render(context)
File "/Library/Python/2.5/site-packages/django/template/__init__.py" in render
176. return self.nodelist.render(context)
File "/Library/Python/2.5/site-packages/django/template/__init__.py" in render
768. bits.append(self.render_node(node, context))
File "/Library/Python/2.5/site-packages/django/template/debug.py" in render_node
71. result = node.render(context)
File "/Library/Python/2.5/site-packages/django/template/defaulttags.py" in render
246. return self.nodelist_false.render(context)
File "/Library/Python/2.5/site-packages/django/template/__init__.py" in render
768. bits.append(self.render_node(node, context))
File "/Library/Python/2.5/site-packages/django/template/debug.py" in render_node
81. raise wrapped
Exception Type: TemplateSyntaxError at /
Exception Value: Caught an exception while rendering: Reverse for 'bizteen.main-home' with arguments '()' and keyword arguments '' not found.
Original Traceback (most recent call last):
File "/Library/Python/2.5/site-packages/django/template/debug.py", line 71, in render_node
result = node.render(context)
File "/Library/Python/2.5/site-packages/django/template/defaulttags.py", line 378, in render
args=args, kwargs=kwargs)
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 'bizteen.main-home' with arguments '()' and keyword arguments '' not found.
【问题讨论】:
【参考方案1】:我想可能是因为
url(r'^browse/$', 'browse', name='projects-browse-main'),
url(r'^browse/(\d+)/$', 'browse', name='projects-browse'),
两者都在 'bizteen.projects.views' 中引用相同的函数 'browse',但其中一个带有参数 (\d+) 而另一个没有。您是否为函数指定了默认参数?像这样
def browse(request, project="1"):
如果不是这样,您的项目范围的 urls.py 中可能存在问题(您的示例看起来像应用程序 urls.py 的摘录)。你的项目范围的 urls.py 中有类似的东西吗?
urlpatterns = patterns('',
(r'^project/', include('bizteen.project.urls))
)
【讨论】:
是的,我在那里指定了一个默认值。此外,该问题适用于我的所有 URL,而不仅仅是共享视图的 URL。 我确实有工作包含语句,是的。我的主要 urls.py 中的名称也不起作用。 您能否编辑您的问题并在其中包含 projects.urls 和 bizteen.projects.views.browse 函数的标头的摘录? 我正在尝试重现您的问题,但没有成功。也许您可以在问题中包含原始回溯? 我添加了回溯。我正在运行 Python 2.5.1,这可能是其中的一部分吗?【参考方案2】:来自我的 urls.py:
url(r'^profile/$', 'bizteen.userthings.user-profile'),
那个视图不存在。我觉得自己很笨。
【讨论】:
【参考方案3】:我个人在我的 urls.py 中导入我的视图,并将它们作为 url() 函数的第二个参数:
from myapp import views as myapp_views
urlpatterns = patterns('',
url("^myapp/blah/$", myapp_views.blah, name="myapp_blah"),
)
它避免出现运行时错误,并允许您添加装饰器,如“login_required”:
from myapp import views as myapp_views
urlpatterns = patterns('',
url("^myapp/blah/$", login_required(myapp_views.blah), name="myapp_blah"),
)
【讨论】:
以上是关于模板 url 标签无法识别 Django 命名的 url的主要内容,如果未能解决你的问题,请参考以下文章