DjangoCMS - 具有共享页面的多个站点

DjangoCMS - multiple sites with shared pages

我正在尝试使用 DjangoCMS 和一些共享页面构建多个网站。是否可以创建一个在所有 django Sites 之间共享的页面?

使用基本的 DjangoCMS 配置,当页面在 Site 上发布时,它不会出现在其他 Site 上。我想知道这是否可以任何方式配置。

在查看代码时,我看到 TreeNode 链接到特定的 Site (https://github.com/divio/django-cms/blob/develop/cms/models/pagemodel.py#L52),所以我想如果可能的话,它不会就这么简单。


class TreeNode(MP_Node):
    # [...]
    site = models.ForeignKey(
        Site,
        on_delete=models.CASCADE,
        verbose_name=_("site"),
        related_name='djangocms_nodes',
        db_index=True,
    )
    # [...]

如果 DjangoCMS 不处理这个问题,我可以使用外部模块,甚至一些想法或如何解决这个问题,我真的没有线索。

非常感谢!

我已经通过 DjangoCMS 代码本身的一些难看的补丁解决了这个问题。

from cms import cms_menus
from cms.templatetags import cms_tags
from cms.utils import page


# Ugly-patching DjangoCMS so that a page from another Django Site can be displayed
def new_get_page_from_path(site, path, preview=False, draft=False):
    """
    Resolves a url path to a single page object.
    Returns None if page does not exist
    """
    from cms.models import Title

    titles = Title.objects.select_related('page__node')
    published_only = not draft and not preview

    if draft:
        titles = titles.filter(publisher_is_draft=True)
    elif preview:
        titles = titles.filter(publisher_is_draft=False)
    else:
        titles = titles.filter(published=True, publisher_is_draft=False)
    titles = titles.filter(path=(path or ''))
    titles = list(titles.iterator())

    for title in titles:
        if title.page.node.site_id != site.pk:
            continue

        if published_only and not page._page_is_published(title.page):
            continue

        title.page.title_cache = {title.language: title}
        return title.page

    # This is the different part from the DjangoCMS code:
    #    re do the same loop, but this time ignore the Site filtering
    for title in titles:
        if published_only and not page._page_is_published(title.page):
            continue

        title.page.title_cache = {title.language: title}
        return title.page
    return


# Ugly-patching DjangoCMS so that a page from another Django Site can fetched
# using {% pageurl %} (for example)
def new_get_page_queryset(site, draft=True, published=False):
    from cms.models import Page

    if draft:
        pages = Page.objects.drafts().on_site(site)
        if pages:
            return pages

    if published:
        pages = Page.objects.public().published(site)
        if pages:
            return pages

    pages = Page.objects.public().on_site(site)
    if pages:
        return pages

    # This is the different part from the DjangoCMS code:
    #    re do the same logic, but this time ignore the Site filtering

    if draft:
        return Page.objects.drafts()

    if published:
        return Page.objects.public().published()
    return Page.objects.public()


page.get_page_from_path = new_get_page_from_path
page.get_page_queryset = new_get_page_queryset
cms_tags.get_page_queryset = new_get_page_queryset
cms_menus.get_page_queryset = new_get_page_queryset

然后我在 urls.py 文件中的 urlpatterns 变量之前导入这个文件(警告你它很丑)。

DjangoCMS 所做的是尝试使用请求中给出的 Site 查找 Page。如果未找到 Page,DjangoCMS 将引发 404 错误,但在我们的例子中,我们重新执行相同的查询,但这次没有 Site 过滤器。

这样,在一个 Site 上创建的 Page 可以在每个子 Site.

上访问

然后我需要一些 Page 可以在每个 Site 上访问,其中大部分内容相同,但有些内容不同。我已经通过使用 static_placeholder 标签解决了这个问题,该标签可以为每个子 Site 指定。 http://docs.django-cms.org/en/latest/reference/templatetags.html#static-placeholder