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

pri*_*stc 22 django django-urls

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

{% for thread in threads %}
    <a href="{% url forum_thread thread %}">{{thread.title}}</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

{% for thread in threads %}
    <a href="{% url forum:thread thread %}">{{thread.title}}</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sys*_*dox 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')),
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • 现在在文档中指定了它,看起来你是正确的:https://docs.djangoproject.com/en/dev/topics/http/urls/#reversing-namespaced-urls我认为没有必要指定` app_name ='forum',除非你想使用与模块名称不同的东西.我猜测如果没有为AJAX请求工作,可能是因为你正在以不同的方式呈现响应(可能不使用模板或不使用RequestContext),因此当转换网址时需要手动指定当前应用程序. (2认同)