基于请求命名空间解析 URL

Posted

技术标签:

【中文标题】基于请求命名空间解析 URL【英文标题】:Resolving URL based on Requesting Namespace 【发布时间】:2019-03-29 02:09:57 【问题描述】:

我正在使用 DjangoCMS 构建一个网站,其中包含大约 10 个相同应用程序的实例。这些不同的实例将仅用于在不同的页面上提供不同的文件。

一切正常,除非我转到应用程序的不同实例并转到详细视图,它会恢复到原始应用程序的 URL 和命名空间。

例如,转到 /university/term-syncc/ 并单击列表视图中的某个项目会将我重定向到 /marketing/4/ 或该项目的任何 ID。

如果我转到/university/term-syncc/4/它可以工作,但我无法让该 URL 自动解析。我知道这与我的 get_absolute_url 调用 assets 命名空间有关,但我如何强制它检查当前的应用命名空间,然后从那里反向运行?

models.py

def get_absolute_url(self):
    return reverse("assets:asset_detail", kwargs="id": self.id)

html

<li>
    <a href="obj.get_absolute_url"> obj.name  test</a>
</li>

urls.py

url(r'^$', asset_list_view, name="asset_list"),
url(r'^(?P<id>\d+)/$', asset_detail_view, name='asset_detail'),

【问题讨论】:

您是否尝试使用 django 详细信息视图进行操作? 不太清楚你的意思 @ChrisWendel 您是否已为所有应用程序命名?在每个的 urls.py 文件中? 是否需要为每个应用实例创建一个新的 urls.py 文件?我会将这些 url 文件放在哪里? @ChrisWendel 您可以将 urls.py 放在每个应用程序中,然后将它们全部包含在项目的 urls.py 中。如果您以这种方式设计您的项目,您将能够为每个 urls.yp 文件提供自己的命名空间,而不是在整个项目中明确地调用来自不同应用程序的 url。 【参考方案1】:

最好的解决方案是为您的应用程序提供一个配置模型。然后它可以在每个实例中使用该配置。

pip install aldryn-apphooks-config

首先,文档在这里; http://docs.django-cms.org/en/latest/how_to/namespaced_apphooks.html#aldryn-apphooks-config

通过实施此解决方案,您的方法将变成这样;

class Asset(models.Model):

    app_config = AppHookConfigField(
        AssetConfig,
        verbose_name=_('Config'),
        help_text='',
    )

    def get_absolute_url(self):
        """Returns the url for this object."""
        if self.app_config and self.app_config.namespace:
            namespace = '0:'.format(self.app_config.namespace)
        else:
            namespace = ''

        return reverse(
            '0assets:asset_detail'.format(namespace),
            kwargs="id": self.id
        )

在不安装此应用的情况下,您仍然可以使用页面高级设置上的 Application instance name 字段来命名您的应用挂钩。您可以改用它,但它需要传递 args/kwargs。

在您的视图或模板中,您可以使用 request.current_page.application_namespace 从页面获取命名空间,以便您可以将其用于链接。

【讨论】:

谢谢马克!我已经放弃了! @ChrisWendel 永不放弃!如果您不确定如何使用 CMS 做某事,请查看 CMS 的开发人员在 github 上对他们的包做了什么; github.com/aldryn 或 github.com/divio

以上是关于基于请求命名空间解析 URL的主要内容,如果未能解决你的问题,请参考以下文章

python 之 Django框架(路由系统include命名URL和URL反向解析命名空间模式)

Django之url上的include,URL命名和反向解析,命名空间 以及图书管理系统删除功能二合一方法

django URL反向解析和命名空间

django url别名和反向解析 命名空间

017:应用命名空间和实例命名空间

tp模式 生命周期 命名空间 路由