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

2024-06-27 02:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用DjangoCMS和一些共享页面构建几个网站。是否可以创建一个跨所有djangoSite共享的页面

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

在查看代码时,我看到TreeNode链接到一个特定的Sitehttps://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没有处理这个问题,或者甚至没有一些关于如何处理这个问题的想法或指导,我可以使用外部模块,我真的没有任何线索

非常感谢


Tags: 代码namehttpsgithubcms网站链接models
1条回答
网友
1楼 · 发布于 2024-06-27 02:20:44

我已经用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上访问

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

相关问题 更多 >