django模板url函数在app中不匹配

时间:2009-11-26 01:55:52

标签: python django google-app-engine

我有一个django项目设置了一个名为pub的应用程序。我正在尝试设置它,以便我可以在顶级urls.py中包含每个应用程序中的urls.py(我将会有更多内容)。我还有一个模板,它使用'url'函数来解析openidgae模块中定义的视图上的url。问题是,在将httprequest路由到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有关,当我通过pub应用程序处理HttpRequest而不是顶层来处理HttpRequest时,它会将我正在尝试解析的视图映射到不可用于模板呈现函数的URL ,但我不明白为什么或如何解决它。

2 个答案:

答案 0 :(得分: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 %},则应获取正确的网址。

答案 1 :(得分: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 %}唯一标识这些网址。这也可以使您的模板更容易阅读,因为您可以给出有意义的名称,因此更容易记住正在发生的事情,同时更简洁。