Wagtail pages giving `none` url with live status

I'm having problems with wagtails.

from the 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/' 

It worked for a while, I moved the Blog Page from root to the Blog Index Page to wagtail admin (see models.py below), and for some reason the page I moved disappeared from the administrator, so I tried to repeat the steps, which I did, having created my database again with ./manage.py sycndb and ./manage.py migrate , created the pages again and now the URLs are no longer displayed.

I added a breakpoint in wagtailcore/models.py to find out what is happening. The critical section seems to be here:

 @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 (ie 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) will never be true in my case.

The variables inside this loop are:

 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 

All this means that my created pages are not routable. I can still browse my pages correctly using the preview mode from wagtail admin, but I cannot find out why there is no path to my pages: (.

Here is my 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"), ] 
+6
source share
1 answer

As a rule, you should create pages as children on the main page. Internally, this means that your blog index page will receive the url_path from /home/blog/ , and since /home/ maps to http://localhost in the root_paths list, this will give it the final URL http://localhost/blog/ .

As you saw, if you create pages at the root level along with the home page, they will exist outside the default site entry and therefore they will not have a routable URL. However, you can configure additional sites through the Django admin interface at http://localhost/django-admin/ - for example, if you want to post your blog at http://blog.example.com/ , you must create a site entry for this domain, embedded on your blog page.

+7
source

Source: https://habr.com/ru/post/972902/


All Articles