python - 在 Wagtail 中实现文章和页面模型之间的一对多

标签 python django wagtail

我正在尝试使用文章到页面结构设置一个 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/

相关文章:

python - 如何动态地将css应用到django include

python - 如何让 Uwsgi 与 wagtail (django) 一起工作

针对只读数据库的 Django 测试

Wagtail:设置默认页面隐私

wagtail - 如何将 Wagtail 图像选择器面板限制为集合

python - Python 3 时来自 BeautifulSoup 的 "illegal multibyte sequence"错误

python - Pandas Merge - 如何避免重复列

python - 当前进程与其他进程之间的管道

python - 导入错误 : cannot import name "urandom"

django - 当时区支持处于事件状态时,DateTimeField 收到一个简单的日期时间