Программно добавить страницу к известному родителю

Я хотел бы создать программно подстраницу для известного родителя. Как я могу это сделать? Создание страницы происходит в приемнике сигнала: страница создается при публикации другой страницы.

4 ответа

Добавить ревизию также.

from wagtail.wagtailcore.models import Page
from models import MyPage

home = Page.objects.get(id=3) # or better Page query
my_page = models.MyPage(title="test", body="<h1>the body</h1>")
home.add_child(instance=my_page)

# later when a cms user updates the page manually 
# there will be no first revision to compare against unless
# you add a page revision also programmatically.

my_page.save_revision().publish() 

Вы можете увидеть, как трясогузка делает это в представлении страниц трясогузки (строка 156). https://github.com/wagtail/wagtail/blob/stable/1.13.x/wagtail/wagtailadmin/views/pages.py

Обновление 2018-18-18: я создал сайт на 700 страниц, включая 200 сгенерированных страниц. Я нигде не добавлял исходную ревизию, и ни один редактор не жаловался на отсутствие первоначальной ревизии при первом редактировании страниц вручную. После первого ручного редактирования будет ревизия. Идите дальше и добавьте начальную редакцию, если считаете, что она необходима для отслеживания.

Чтобы создать страницу программно:

page = SomePageType(title="My new page", body="<p>Hello world</p>")  # adjust fields to match your page type
parent_page.add_child(instance=page)

Ниже мой полный код для создания многоязычной структуры страницы программно. Он заменит "Wagtail Welcome Page" на экземпляр LanguageRedirectionPage.

Больше информации о многоязычных страницах: Wagtail Docs - Интернационализация

Структура страницы выглядит следующим образом:

  • страница
    • LanguageRedirectionPage (будет перенаправлен в /en)
      • Страница (en)
      • Страница (де)
      • Страница (пт)

где созданный экземпляр Site в конце кода указывает на экземпляр LanguageRedirectionPage. Это точка входа нашего приложения.

# Deletes existing pages and sites
Site.objects.all().delete()
Page.objects.filter(pk=2).delete() # Deletes Wagtail welcome page
root_page = Page.objects.filter(pk=1).get()

# Adds a LanguageRedirectionPage as a child of the Root Page
app_name = '[Your Project Name]'
page_slug = app_name.lower().replace(" ", "")
sub_root_page = LanguageRedirectionPage(
    title=app_name,
    draft_title=app_name,
    slug=page_slug,
    live=True,
    owner=account,
)

root_page.add_child(instance=sub_root_page)
sub_root_page.save_revision().publish()

# Adds some language pages
for code,caption in dict(settings.LANGUAGES).items():
    print(code, caption)
    sub_root_page.add_child(instance=Page(
        title=caption,
        slug=code,
        live=True,
        owner=account,
    ))

# Adds a new Site instance (See Settings -> Sites in your Wagtail admin panel)
Site.objects.create(
    hostname='localhost',
    port='80',
    site_name=app_name,
    root_page=sub_root_page,
    is_default_site=True,
)

Я оставил вам то, что сработало для меня, используя миграцию django:

      from django.db import migrations
from wagtail.models import Page, Locale, Site


def create_wagtail_home_page(apps, schema_editor):
    HomePage = apps.get_model("blog.HomePage")
    ContentType = apps.get_model("contenttypes.ContentType")

    # Get the content type for the Page model
    page_content_type = ContentType.objects.get(app_label="wagtailcore", model="page")

    root_page = Page.objects.order_by("id").first()

    default_locale = Locale.objects.first()

    home_page = HomePage(title="Home", body="", locale_id=default_locale.id, content_type=page_content_type)

    root_page.add_child(instance=home_page)

    # Refresh the home page instance, this Must be a PageInstance for the next step to work
    home_page = Page.objects.order_by("-id").first()

    # Create a site with the new homepage set as the root
    Site.objects.create(hostname="localhost", root_page=home_page, is_default_site=True)



def reverse_home_page(apps, schema_editor):
    HomePage = apps.get_model("blog.HomePage")
    HomePage.objects.all().delete()
    


class Migration(migrations.Migration):
    dependencies = [
        ("blog", "0002_homepage"),
    ]

    operations = [
        migrations.RunPython(create_wagtail_home_page, reverse_home_page),
    ]
Другие вопросы по тегам