DjangoCMS - 具有共享页面的多个站点
DjangoCMS - multiple sites with shared pages
我正在尝试使用 DjangoCMS
和一些共享页面构建多个网站。是否可以创建一个在所有 django Site
s 之间共享的页面?
使用基本的 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
我正在尝试使用 DjangoCMS
和一些共享页面构建多个网站。是否可以创建一个在所有 django Site
s 之间共享的页面?
使用基本的 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