基于请求命名空间解析 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)
<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反向解析命名空间模式)