Wagtail页面给出“none”url和“live”状态



我在使用wagtail页面时遇到了一些麻烦。

from shell

>>> Site.get_site_root_paths()
[(1, u'/home/', u'http://localhost')]
>>> BlogPage.objects.all()[0]
<BlogPage: Hello wagtail>
>>> BlogPage.objects.all()[0].url
>>> BlogPage.objects.all()[0].full_url
>>> BlogPage.objects.all()[0].status_string
'live'
>>> BlogPage.objects.all()[0].url_path
u'/blog/hello-wagtail/'

它工作了一段时间,我将Blog Pageroot移动到wagtail管理中的Blog Index Page(见下面的models.py),由于某种原因,我移动的页面从管理中消失了,所以我试图重复我通过再次使用./manage.py sycndb./manage.py migrate创建数据库所做的步骤,再次创建页面,现在url不再显示。

我在wagtailcore/models.py中添加了一个断点来查看发生了什么。临界区似乎在这里:

@property
    def url(self):
        """
        Return the 'most appropriate' URL for referring to this page from the pages we serve,
        within the Wagtail backend and actual website templates;
        this is the local URL (starting with '/') if we're only running a single site
        (i.e. we know that whatever the current page is being served from, this link will be on the
        same domain), and the full URL (with domain) if not.
        Return None if the page is not routable.
        """
        root_paths = Site.get_site_root_paths()
        for (id, root_path, root_url) in Site.get_site_root_paths():
            if self.url_path.startswith(root_path):
                return ('' if len(root_paths) == 1 else root_url) + self.url_path[len(root_path) - 1:]

self.url_path.startswith(root_path)在我的例子中从来不是正确的。

循环中的变量:

id = {int} 1
root_path = {unicode} u'/home/'
root_paths = {list} [(1, u'/home/', u'http://localhost')]
root_url = {unicode} u'http://localhost'
self = {Page} Blog

所有这些都意味着我创建的页面是不可路由的。我仍然可以使用wagtail admin的预览模式正确查看我的页面,但我不知道为什么没有路由到我的页面:(.

这是我的models.py

from django.db import models
from wagtail.wagtailcore.models import Page, Orderable
from wagtail.wagtailcore.fields import RichTextField
from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel, InlinePanel, PageChooserPanel
from modelcluster.fields import ParentalKey

class BlogPage(Page):
    body = RichTextField()
    intro = RichTextField()
    date = models.DateField("Post date")
    indexed_fields = ('body', )
    search_name = "Blog Page"

BlogPage.content_panels = [
    FieldPanel('title', classname="full title"),
    FieldPanel('date'),
    FieldPanel('intro', classname="full"),
    FieldPanel('body', classname="full"),
]

class LinkFields(models.Model):
    link_page = models.ForeignKey(
        'wagtailcore.Page',
        null=True,
        blank=True,
        related_name='+'
    )
    panels = [
        PageChooserPanel('link_page'),
    ]
    class Meta:
        abstract = True

class RelatedLink(LinkFields):
    title = models.CharField(max_length=255, help_text="Link title")
    panels = [
        FieldPanel('title'),
        MultiFieldPanel(LinkFields.panels, "Link"),
    ]
    class Meta:
        abstract = True

class BlogIndexPageRelatedLink(Orderable, RelatedLink):
    page = ParentalKey('main.BlogIndexPage', related_name='related_links')

class BlogIndexPage(Page):
    intro = models.CharField(max_length=256)
    indexed_fields = ('body', )
    search_name = "Blog Index Page"

BlogIndexPage.content_panels = [
    FieldPanel('title', classname="full title"),
    FieldPanel('intro', classname="full"),
    InlinePanel(BlogIndexPage, 'related_links', label="Related links"),
]

一般来说,你应该创建页面作为主页的子页面。在内部,这意味着您的博客索引页将接收到/home/blog/的URL路径,并且由于/home/在root_paths列表中映射到http://localhost,这将给它一个http://localhost/blog/的最终URL。

如您所见,如果您在主页旁边的根级别创建页面,它们将存在于默认Site记录之外,因此它们将没有可路由的URL。但是,您可以通过Django管理界面在http://localhost/django-admin/上设置其他站点——例如,如果您想在http://blog.example.com/上托管您的博客,您可以在您的博客索引页上为该域创建一个Site条目。

最新更新