根据请求名称空间解析URL

时间:2018-10-24 15:26:23

标签: django namespaces django-urls django-cms

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

1 个答案:

答案 0 :(得分:0)

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

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从页面获取名称空间,以便将其用于链接。