Wagtail:在基于 Class 的视图中以编程方式呈现页面

Wagtail: render a page programmatically in a Class Based View

我有一个 Wagtail 设置,用户可以在其中 select 呈现一个页面,如果没有设置,它 returns 一个使用 ListView 最近的列表页面职位。这是设置:

@register_setting
class PeregrineSettings(BaseSetting):
    """
    Settings for the user to customize their Peregrine blog.
    """
    landing_page = models.ForeignKey(
        'wagtailcore.Page',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        help_text='The page to display at the root. If blank, displays the latest posts.'
    )

设置有效。当我尝试在 ListView 中使用它时,我试图将 url_path 传递给 Wagtail 的 serve 方法,但它不会呈现页面视图;我收到 404。这是 ListView:

的代码
class PostsListView(ListView):
    """
    Paginated view of blog posts.
    """
    model = SitePost
    template_name = 'peregrine/site_post_list.html'
    context_object_name = 'posts'
    paginate_by = 10
    ordering = ['-post_date']

    def get(self, request, *args, **kwargs):
        peregrine_settings = PeregrineSettings.for_site(request.site)
        if peregrine_settings.landing_page is None:
            # Render list of recent posts
            response = super().get(request, *args, **kwargs)
            return response
        else:
            # Render landing page
            return serve(request, peregrine_settings.landing_page.url_path)

感觉我缺少一种方法,可以将存储在 peregrine_settings.landing_page 中的 Page 实例传递给要呈现的方法。任何人都可以阐明这里工作的内部结构吗?谢谢!

我认为你在这里调用的 serve 函数是 wagtail.core.views 中定义的视图?这个视图本身并没有做太多事情——它在站点根页面上调用 route() 来定位正确的页面,然后调用该页面的 serve() 方法(传递请求对象)来进行实际的页面呈现.看起来后一种 serve() 方法正是您所需要的:

def get(self, request, *args, **kwargs):
    peregrine_settings = PeregrineSettings.for_site(request.site)
    if peregrine_settings.landing_page is None:
        # ...
    else:
        # Render landing page
        return peregrine_settings.landing_page.serve(request)

可以在此处找到有关 routeserve 方法的一些进一步文档: http://docs.wagtail.io/en/v2.0/reference/pages/theory.html#anatomy-of-a-wagtail-request http://docs.wagtail.io/en/v2.0/reference/pages/model_recipes.html#overriding-the-serve-method