命名空间网址解析

时间:2013-06-12 01:42:00

标签: python django django-templates

我正在努力让django namespaced url resolution工作,因为我希望我的老板和他的老板能够看到模板,并从一个只是填充虚假数据的应用程序中评论这些模板并对其进行评论任何事情,虽然我使用相同的模板在不同的应用程序中开发实时代码。因此,如果您转到http://localhost:8000/template_test/base,则会看到带有虚假数据的base.html模板,如果您转到http://localhost:8000/uar/base,则会看到带有(希望)真实数据的base.html。作为一个额外的复杂功能,页面上有一个链接,应该使用假数据或真实数据转到uar.html,具体取决于您是否转到/ template_test / base url或/ uar / base url。

所以这是模板的适当部分:

<li>
  <a href="{% url 'uar:uar' %}">User Access Review</a>
</li>

这是我的项目/ urls.py的适当部分

url(r'^template_test/', include(template_test.urls,
    namespace="uar", app_name="template_test")),

url(r'^uar/', include(uar.urls, namespace="uar", app_name="uar")),

在template_test / urls.py

urlpatterns = patterns('',
  url(r'^base$', template_test.views.base, name="base"),
  url(r'^uar$', template_test.views.uar_missing, name="uar"),

在uar / urls.py

urlpatterns = patterns('',
  url(r'^base$', uar.views.base, name="base"),
  url(r'^uar$', uar.views.uar_missing, name="uar"),

template_test / views.py

def base(request):
    return render(request, "base.html", {"full_name": "Fake User"},
            current_app="template_test")

和uar / views.py

def base(request):
    return render(request, "base.html", {"full_name": "Paul Tomblin"},
            current_app="uar")

def uar_missing(request):
    return render(request, "uar.html", {}, current_app="uar")

但是,尽管我正在为模板提供应用上下文,但当base.html在任一上下文中呈现时,模板中的{% url 'uar:uar' %}最终都是/template_test/uar/上下文({{full_name}}具有适当的值,分别为“假用户”或“保罗汤姆林”。我需要更改什么才能使该链接使用当前的应用程序上下文?

其他信息应用程序上下文无法使用reverse:

python manage.py shell
Python 2.7.4 (default, Apr 19 2013, 18:28:01) 
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.urlresolvers import reverse
>>> reverse('uar:uar')
'/template_test/uar'
>>> reverse('uar:uar', current_app='uar')
'/template_test/uar'
>>> reverse('uar:uar', current_app='template_test')
'/template_test/uar'
>>> reverse('uar:uar', current_app='txx')
'/template_test/uar'

1 个答案:

答案 0 :(得分:0)

显然我混淆了“namespace”和“app_name”。我的project / urls.py现在看起来像:

   url(r'^template_test/',
        include(build_urls(template_test.views, 'template_test'),
        namespace="template_test", app_name="uar")),

    url(r'^uar/',
        include(build_urls(uar.views, 'uar'),
        namespace="uar", app_name="uar")),

注意:我已经切换了命名空间和app_name。

template_test / views.py有

def base(request):
    return render(request, "base.html", {"full_name": "Fake User"},
            current_app="template_test")

和uar / views.py有

def base(request):
    return render(request, "base.html", {"full_name": "Paul Tomblin"})

注意:我不再传递uar / views.py中的current_app了。

作为额外的奖励,我还发现当我使用重定向时,我需要使用正确的current_app进行“反向”。

相关问题