Django模板URL函数在应用中不匹配

0 投票
2 回答
1105 浏览
提问于 2025-04-15 16:24

我有一个用Django搭建的项目,里面有一个叫pub的应用。我想把每个应用的urls.py文件包含到顶层的urls.py中(以后还会有更多应用)。我还有一个模板,它使用'url'函数来解析一个在openidgae模块中定义的视图的URL。问题是,当http请求被正确地路由到pub.views.index后,我尝试通过渲染一个使用模板'url'函数的模板来响应,但遇到了问题。下面的代码我也放在这里了:http://gist.github.com/243158

这是我的顶层urls.py:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
   (r'', include('openidgae.urls')),
   (r'^pub', include('pub.urls')),  
)

还有pub/urls.py:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
   (r'', 'pub.views.index'),
   (r'^/$', 'pub.views.index'),
)

以及templates/base.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>{% block title %}My amazing site{% endblock %}</title>
</head>
<body>
    <div id="header">
     {% if lip %}
        Welcome {{ lip.pretty_openid }}
        <a href="{% url openidgae.views.LogoutSubmit %}">logout</a>
     {% else %}
        <form id="login-form" action="{% url openidgae.views.OpenIDStartSubmit %}?continue={{continueUrl}}" method="post">
            <input type="text" name="openid_identifier" id="openid_identifier" />
            <input type="submit" value="Verify" />
        </form>

        <!-- BEGIN ID SELECTOR --> 
        <script type="text/javascript" id="__openidselector" src="https://www.idselector.com/selector/46b0e6d0c8ba5c8617f6f5b970865604c9f87da5" charset="utf-8"></script>
        <!-- END ID SELECTOR -->
     {% endif %}
    </div>
{% block content %}{% endblock %}
</body>
</html>

还有templates/pub/index.html:

{% extends "base.html" %}

{% block title %}blahblah!{% endblock %}

{% block content %}
  blahblahblah
{% endblock %}

最后是pub/views.py:

from django.shortcuts import render_to_response
from django.http import HttpResponse
from django import forms
import openidgae

def index(request):
    lip = openidgae.get_current_person(request, HttpResponse())
    resp = render_to_response('pub/index.html', {'lip': lip})
    return resp

现在,如果我把顶层urls.py中的第二个模式直接指向'pub.views.index',一切都能正常工作,但如果我使用include函数就不行了。

有没有什么想法?我觉得问题可能和urlpattern有关,也就是我想解析的视图的URL在处理HttpRequest时没有被提供给模板渲染函数,因为是pub应用在处理,而不是顶层的urls.py,但我不明白为什么会这样,也不知道该怎么解决。

2 个回答

1

我不太明白你遇到的问题是什么,不过光看你的urls.py文件,你可能需要把顶层的urls.py改成这样:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
   (r'', include('openidgae.urls')),
   (r'^pub/', include('pub.urls')),  
)

然后把pub/urls.py改成:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
   (r'^$', 'pub.views.index'),
)

如果你在模板的某个地方使用{% url pub.views.index %},那么你应该能得到正确的链接。

0

你发了很多代码,但没有清楚地说明实际的问题是什么。首先,拥有

(r'', 'pub.views.index'),
(r'^/$', 'pub.views.index'),

如果你想找到网址,这可能会带来一些问题。那么,pub.views.index的网址应该是什么呢?根据你所说的,这实际上并不是一个问题,因为你没有一个模板标签需要反向调用这个视图。你并没有具体说明哪里出错了。不过,如果你想保留这两个网址,有一种解决上述问题的方法,就是使用命名网址。我觉得这有点多余,因为你可以直接把example.com/pub重定向到example.com/pub/,但你可以把上面的内容改成:

url(r'', 'pub.views.index' name='pub_a'),
url(r'^/$', 'pub.views.index', name='pub_b'),

这样做后,你就可以反向获取你的网址,因为你可以通过{% url pub_a %}{% url pub_b %}来唯一识别它们。这也会让你的模板更容易阅读,因为你可以给出有意义的名字,这样更容易记住发生了什么,同时也更简洁。

撰写回答