我正在尝试使用文章到页面结构设置一个 Wagtail 站点,但我正在努力。例如,评论文章可能有介绍页面、基准页面和结论页面。我想弄清楚如何在 wagtail 中允许这种关系并拥有它,以便编辑可以将多个页面添加到同一页面上的同一篇文章。我可以想象页面界面看起来有点像您在页面上拥有内容、推广和设置的方式,但具有添加、重命名和重新排序页面的能力。我试过在链接到文章的页面模型上使用外键,但我无法按照我想要的方式在管理员中显示它。
这是我想要使用的模型布局的 django 版本。您有一篇由一页或多页组成的父文章。这些页面应该是可编辑的、可订购的,并且可以在带有流域的管理面板中创建:
Class Article(models.Model)
STATE_DRAFT = 0
STATE_REVIEW= 1
STATE_PUBLICATION = 2
STATE_HIDDEN = 3
STATE = (
(STATE_DRAFT, 'draft'),
(STATE_REVIEW, 'pending review'),
(STATE_PUBLICATION, 'ready for publication'),
(STATE_HIDDEN, 'hide and ignore'),
)
title = models.CharField(_('title'), max_length=256)
slug = models.SlugField(
_('slug'), unique=True, blank=True, default='', max_length=256
)
description = models.TextField(
_('description'), max_length=256, blank=True, default=''
)
author = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='article'
)
publication = models.DateTimeField(
null=True, blank=True, default=None, db_index=True, help_text='''
What date and time should the article get published
'''
)
state = models.PositiveIntegerField(
default=0, choices=STATE, help_text='What stage is the article at?'
)
featured = models.BooleanField(
default=False,
help_text='Whether or not the article should get featured'
)
class Page(Page):
article = models.ForeignKey(
'Article', on_delete=models.CASCADE, related_name='pages'
)
title = models.CharField(max_length=256)
number = models.PositiveIntegerField(default=1) # So pages are ordered
body = models.TextField(blank=True)
最佳答案
根据我的评论,我认为除了实现完全定制的 CMS 之外,您无法实现您正在寻找的一切 - 但如果您能够改变 UI 和数据建模要求,那么 Wagtail 的RoutablePageMixin
是实现将一篇文章作为一个单元进行编辑,同时在前端将其呈现为多个页面的一般模式的一种可能方式。
在这种方法中,您将使 Article
成为一个 Wagtail 页面模型,所有子页面内容都定义为该模型上的字段(或 InlinePanel 子模型)。 (如果您想在编辑界面中将内容条目拆分为选项卡,请参阅 Customising the tabbed interface ,尽管这不支持动态添加/重新排序它们。)然后您将为文章的每个子页面定义一个 URL 路由和模板:
from wagtail.core.models import Page
from wagtail.contrib.routable_page.models import RoutablePageMixin, route
class ArticlePage(RoutablePageMixin, Page):
intro = StreamField(...)
main_page = StreamField(...)
conclusion = StreamField(...)
@route(r'^$')
def intro_view(self, request):
render(request, 'article/intro.html', {
'page': self,
})
@route(r'^main/$')
def main_page_view(self, request):
render(request, 'article/main_page.html', {
'page': self,
})
@route(r'^conclusion/$')
def conclusion_view(self, request):
render(request, 'article/conclusion.html', {
'page': self,
})
在此示例中,三个子页面是硬编码的,但通过更多的工作(可能是一个带有 slug 字段和 StreamField 的 InlinePanel 子模型),您可以使子页面动态化。
关于python - 在 Wagtail 中实现文章和页面模型之间的一对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58221962/