N.B在第一个答案给出之前,这个问题已被大量编辑。
您好,
我是django的新手,如果我遗漏了一些明显的东西,请道歉。
我有一个urls.py文件,如下所示:
urlpatterns = patterns(
'',
(r'^$', 'faros.lantern.views.home_page'),
(r'^login/$', 'django.contrib.auth.views.login'),
(r'^logout/$', 'django.contrib.auth.views.logout'),
(r'^about/$', 'faros.lantern.views.about_page_index', {}, 'about_page_index'),
(r'^about/(?P<page_id>([a-z0-9]+/)?)$', 'faros.lantern.views.about_page', {}, 'about_page'),
)
看起来像这样:
def about_page_index(request):
try:
return render_to_response('lantern/about/index.html', context_instance=RequestContext(request))
except TemplateDoesNotExist:
raise Http404
def about_page(request, page_id):
page_id = page_id.strip('/ ')
try:
return render_to_response('lantern/about/' + page_id + '.html', context_instance=RequestContext(request))
except TemplateDoesNotExist:
raise Http404
包含此内容的模板:
<a href="{% url lantern.views.about_page_index %}">Contact</a>
<a href="{% url lantern.views.about_page page_id="contact" %}">Contact</a>
我收到此错误消息:
Caught an exception while rendering: Reverse for '<function about_page at 0x015EE730>' with arguments '()' and keyword arguments '{'page_id': u'contact'}' not found. The first reverse works fine (about_page_index), generating the correct URL without error messages.
我认为这是因为使用了about_page视图(request
)的请求参数,所以当我在模板中生成URL时,我需要传递它。问题是,我不知道如何去做,而四处搜寻并没有把我带到任何地方。有什么想法吗?
谢谢,
的Dom
P.S。顺便说一句,在应用程序中处理静态“约”类型页面的方法是否看起来可怕或合理?我本质上是在使用URL并假设模板的路径是about/
位之后的任何内容。这意味着我可以使静态页面看起来像应用程序的一部分,因此用户可以跳转到about部分,然后再回到它们来自的位置。评论/反馈是否是djangoic或愚蠢的赞赏!
答案 0 :(得分:9)
如果我从您的视图函数(def about_page(request, page_id = None):
)的签名中正确猜测,您可能有另一个URL配置指向同一视图但不带page_id
参数。如果是这样,django反向函数将只看到其中一个,并且它可能看到没有名为page_id
正则表达式模式的那个。这是一个相反的常见问题! : - )
要解决此问题,请为每个网址模式指定一个名称(请参阅Syntax of the urlpatterns variable)。在您的示例中,您可以执行以下操作:
(r'^about/(?P<page_id>([a-z]+/)?)$', 'faros.lantern.views.about_page',
{}, 'about_with_page_id')
然后在模板中:
<a href="{% url about_with_page_id page_id="contact" %}">Contact</a>
修改强>
感谢您发布更新后的urls.py.在url
模板标记中,使用非限定模式名称应该可以解决问题(请注意我正在删除lantern.views
部分:
<a href="{% url about_page_index %}">Contact</a>
<a href="{% url about_page page_id="contact" %}">Contact</a>
<强> EDIT2 强>
对不起,我之前没有这样做过。你的模式以django无法反转的方式表达,这就是导致不匹配的原因。而不是:
r'^about/(?P<page_id>([a-z]+/)?)$'
使用:
r'^about/(?P<page_id>[a-z0-9]+)/$'
我在我的系统上创建了一个与您匹配的虚拟项目,重现了错误,并将此更正插入到成功中。如果这不能解决你的问题,我会吃掉我的帽子! : - )