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

问题描述 投票:22回答:3

我有一个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 %}

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

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

我应该如何在这个应用程序中做网址?

django django-urls
3个回答
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个实例。

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

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

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

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


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"),

更正语法解决了问题。


0
投票

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

在Django 2.1.7中

  • 您可以在app的urls.py文件中使用app name
# 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 %}
© www.soinside.com 2019 - 2024. All rights reserved.