【问题标题】:Resolving URL based on Requesting Namespace基于请求命名空间解析 URL
【发布时间】: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。

标签: django namespaces django-urls django-cms


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

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

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

【讨论】:

  • 谢谢马克!我已经放弃了!
  • @ChrisWendel 永不放弃!如果您不确定如何使用 CMS 做某事,请查看 CMS 的开发人员在 github 上对他们的包做了什么; github.com/aldryngithub.com/divio
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多