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)
可以在此处找到有关 route
和 serve
方法的一些进一步文档:
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
我有一个 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)
可以在此处找到有关 route
和 serve
方法的一些进一步文档:
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