正在根据请求命名空间解析 URL

Resolving URL based on Requesting Namespace

我正在使用 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'),

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

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(
            '{0}assets:asset_detail'.format(namespace),
            kwargs={"id": self.id}
        )

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

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