【问题标题】:Namespace and URLs Multi-site命名空间和 URL 多站点
【发布时间】:2023-03-21 23:29:01
【问题描述】:

我对 Python 和 Django 很陌生,但我正在开发一个多站点 Django,创建于 1.9

我目前正在尝试使其与 Django 2.0 一起使用,但我不明白命名空间和 URL 的工作原理。

这是没有改变的sn-p:

/* Template */
<li><a href="{% url 'account:profile' %}">Profil {{ user.firstname.0 }}. {{ user.lastname }}</a></li>

/* Search project URLS.PY */
ACCOUNT_PATTERNS = [ url(r'^profil$', views.MyProfileFormView.as_view(), name='profile'), ]
urlpatterns = [ url(r'^gestion/', include(ACCOUNT_PATTERNS, namespace='account')), ]

这是 1.9 版本的工作方式(帐户在搜索站点中映射):

/* Main project URLS.PY */
from search import urls as search_urls
urlpatterns = [
    url(r'^frontend/', include(frontend_urls)),
    url(r'^search/', include(search_urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这是我正在尝试使用的 2.0 修改版本:

/* Main project URLS.PY */
temppatterns = [   
    path('admin/', admin.site.urls),
    path('search/', include(search_urls)),
]
urlpatterns = temppatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

但是当我去 /search 时,我得到了这个

NoReverseMatch 在 /search/
'account' 不是注册的命名空间

我确实相信 URLConf 发生了一些巨大的变化,但我找不到任何文档来帮助我理解内容和原因。

添加一些上下文:

  • 我没有旧服务器的访问权限
  • 帐户正在搜索中。搜索是一个子网站。
  • 如果我理解正确,如果我们在主项目中包含 conf,我们应该能够在 alt 站点 URLConf 上使用命名空间,但这里不是这样

如果您需要任何东西,请随时问我,我已经在这个项目上做了很多工作,但现在我只是不明白这部分。

我应该重新购买所有 URLConf 以将命名空间包含在主项目 URLConf 中吗?

提前感谢您帮助我理解

【问题讨论】:

  • /* search projects did not change */ 表示/* search project URLS.PY */ 下没有任何变化?请包括所有相关代码sn-ps。
  • 就是这样。我进行了编辑以使其更具可读性,但总共有 200 行。所以我可以添加更多东西,但我想保持消化。感谢您的 cmets 寿,不要犹豫,问更多的东西
  • 请注意,您不必在 Django 2.0 中使用 path() - url() 仍然可以使用。如果您尽可能少地进行更改,直到您可以正常工作,升级会更简单。
  • 感谢@Alasdair,这是真的,re_path() 也是如此,我只是在测试它,看看它是否可以改变任何东西。但不是。 ://
  • 您的search/urls.py 是否设置了app_name

标签: python django django-urls


【解决方案1】:

由于您添加了app_name = 'search',您的account 命名空间现在嵌套在search 命名空间内。因此,在反向 URL 时应使用search:account:,例如:

{% url 'search:account:profile' %}

【讨论】:

  • 只是为了确定。这是 Django 2.0 中的新功能?有没有办法避免使用命名空间?我在尝试使用命名空间但没有 app_name 时遇到了很多问题。在此先感谢您的帮助
  • 恐怕我不明白你的评论。看起来您需要添加search:,因为您已经添加了app_name = 'search'。如果您不想这样做,请不要设置app_name。如果您想了解有关 include() 的命名空间更改的更多信息,请参阅 Django 1.9 release notes。由于这些更改是在 Django 1.9 中进行的,因此您应该能够在 Django 1.9 和 2.0 中获得相同的代码。
猜你喜欢
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2015-01-27
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
相关资源
最近更新 更多