【问题标题】:Get objects from current site without settings.SITE_ID从当前站点获取对象而不使用 settings.SITE_ID
【发布时间】:2018-05-03 15:36:58
【问题描述】:

我正在寻找与 CurrentSiteManager 提供的相同功能,但不必在 settings.py 中将 SITE_ID 指定为 the CurrentSiteManager requires。有关当前站点的信息应来自请求。我对这个问题的看法是制作一个自定义经理,但我有什么遗漏吗?这样做的好方法是什么? CurrentSiteManager 应该提供此功能似乎很简单。提交功能请求是否有意义?

【问题讨论】:

  • 您链接到的代码已有一年多的历史了 - SiteManagerlatest version 实现了基于主机的方法,如果未定义 SITE_ID,则从主机名获取当前站点。跨度>
  • @solarissmoke:我已经在使用 SiteManager,但 CurrentSiteManager 不提供该功能。我想要一个等效于 User.objects.all() 的函数,它只返回与当前站点关联的用户(通常是 User.on_site.all(),但这需要设置 SITE_ID)。
  • 啊,我明白了。感谢您的澄清。我已经发布了一个我认为可以解释为什么这不是 Django 可以为您做的事情的答案。

标签: django django-sites


【解决方案1】:

你写:

有关当前站点的信息应来自请求。

这里有一个很大的假设,即管理器总是有一个可用的请求上下文。

这不是 Django 可以做出的假设:任何通用模型管理器都必须在请求上下文之外工作,因为在各种情况下请求上下文不可用 - 例如,管理命令、迁移、任务、等等。即使您在请求的上下文中,您的经理也不知道这一点,除非您明确地将其传递给经理上的任何方法(即,您需要这些方法来接受 request 参数)。这就是为什么CurrentSiteManagerrequires a SITE_ID

CurrentSiteManager 仅在您的设置中定义了SITE_ID 设置时可用。

如果您确实想在请求上下文中过滤对象,那么 Django 提供CurrentSiteMiddleware 以将当前站点添加到所有请求中。然后,您可以在您的视图中过滤此 site 上的对象。

有一些项目示例实现了自定义 CurrentSiteManager,它可以满足您的要求 - 您可以想到的是 Mezzanine,您可以从中借用(请注意,它涉及搞乱使用线程局部变量,并且仍然需要回退到 SITE_ID 设置)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2023-03-13
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2011-10-08
    相关资源
    最近更新 更多