【问题标题】:Programatically add a page to a known parent以编程方式将页面添加到已知父级
【发布时间】:2017-03-27 07:13:17
【问题描述】:

我想以编程方式为已知父级创建一个子页面。我怎样才能做到这一点?页面创建将在信号接收器中进行:该页面是在另一个页面发布时创建的。

【问题讨论】:

    标签: wagtail


    【解决方案1】:

    也添加一个修订。

    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() 
    

    您可以在 wagtailadmin 页面创建视图(第 156 行)中查看 wagtail 是如何做到这一点的。 https://github.com/wagtail/wagtail/blob/stable/1.13.x/wagtail/wagtailadmin/views/pages.py

    2018 年 9 月 18 日更新: 我建立了一个 700 页的网站,其中包括 200 个生成的页面。我从未在任何地方添加初始修订,也没有编辑抱怨。在第一次手动编辑之后会有一个修订。如果您认为可追溯性需要,请继续添加初始修订。

    【解决方案2】:

    以编程方式创建页面:

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

    【讨论】:

      【解决方案3】:

      以下是我以编程方式创建多语言页面结构的完整代码。它将用 LanguageRedirectionPage 实例替换“Wagtail 欢迎页面”。

      有关多语言页面的更多信息: Wagtail Docs - Internationalization

      页面结构如下:

      • 页面
        • LanguageRedirectionPage(将重定向到 /en)
          • 页面(英文)
          • 页面(de)
          • 页面(法国)

      在代码末尾创建的 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,
      )
      

      【讨论】:

      • 一切都很好,但你必须使用 site = Site(...); site.save() 用于页面一致性以避免警告没有可用的页面。
      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多