我有一个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 %}
但这不是正确的方法。这里的文档有点不清楚。
我希望这个应用程序可重用且易于配置。但我也想使用最好的标准。我不想让用户指定自己的命名空间名称,然后让他们编辑每个模板中的每个网址。
我应该如何在此应用中使用网址?
答案 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中
# 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' %}
我认为我们应该
threads
作为上下文返回...
path('thread/<int:pk>', views.mark_done, name='thread')
模板中的网址如下:
{% for thread in threads %}
<a href="{% url 'forum:thread' thread.id %}">{{thread.title}}</a>
{% endfor %}