如何在可重用的应用程序中使用带有django的命名空间URL

时间:2010-07-01 07:14:07

标签: django django-urls

我有一个django应用程序,一个论坛应用程序,它有模板。在这些模板中,有一些网址指向应用程序的某些部分。例如,thread_list模板具有到每个线程的链接,如下所示:

{% for thread in threads %}
    <a href="{% url forum_thread thread %}">{{thread.title}}</a>
{% endfor %}

问题是,我真的不喜欢打电话给我的网址“forum_thread”。我更喜欢“线程”并使用django的命名空间功能。 “forum_thread”可以在项目的其他地方使用(命名空间冲突)。所以它看起来像这样:

{% for thread in threads %}
    <a href="{% url forum:thread thread %}">{{thread.title}}</a>
{% endfor %}

但这不是正确的方法。这里的文档有点不清楚。

我希望这个应用程序可重用且易于配置。但我也想使用最好的标准。我不想让用户指定自己的命名空间名称,然后让他们编辑每个模板中的每个网址。

我应该如何在此应用中使用网址?

3 个答案:

答案 0 :(得分:14)

根据我的描述,你应该可以使用{%url forum:thread thread%}。命名空间似乎总是用两个变量定义,命名空间和app_name。

如果您在urls.py中执行以下操作:

url(r'^/forum/', include('forum.urls', namespace='forum', app_name='forum')),
url(r'^/foo/', include('forum.urls', namespace='foo', app_name='forum')),
url(r'^/bar/', include('forum.urls', namespace='bar', app_name='forum')),

根据我的理解,这定义了应用程序'forum','foo','bar'和默认(具有namespace == app_name)的3个实例。

当您反向论坛:线程时,它使用当前上下文来确定使用哪一个 - 如果您在命名空间'foo'中它将使用它,否则它将回退到默认值。

如果有人能够澄清Django如何决定'当前'命名空间/应用程序是什么将是非常有帮助的。我目前将其归类为“黑魔法”。

对命名空间和app_name之间的实际区别进行一些澄清也会有所帮助 - 我可能完全颠倒了这一点。目前的文档非常含糊不清。

注意:我有这个用于初始请求,但我目前无法为AJAX请求做这项工作 - 那些因某些原因总是使用默认实例。

答案 1 :(得分:1)

这可能是一个简单的语法错误。我跟随Django Tutorial,我不正确地改变了mysite / urls.py。原始语法:

url(r'^polls/', include('polls.urls')),

理想的变化:

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

我做了什么:

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

更正语法解决了问题。

答案 2 :(得分:0)

基于我对这个问题的理解:

  

在Django 2.1.7中

  • 您可以在应用的urls.py文件中添加应用名称
# app's urls.py
from django.urls import path
from . import views

app_name = 'forum'
urlpatterns = [
    path('thread/', views.mark_done, name='thread')
]

在主要urls.py

# urls.py
....

urlpatterns = [
    path('forum/', include('forum.urls')),
]

然后您可以在模板中使用{% url 'forum:thread' %}

  • 如果要在for循环中使用它

我认为我们应该

  1. 创建视图,将所有threads作为上下文返回
  2. 然后为该视图添加路径
...
path('thread/<int:pk>', views.mark_done, name='thread')

模板中的网址如下:

{% for thread in threads %}
    <a href="{% url 'forum:thread' thread.id %}">{{thread.title}}</a>
{% endfor %}