Создание страниц программным способом с помощью Django и Wagtail

Мне удалось программно создать страницы с помощью команд управления Django, как показано здесь и здесь.

Как мне связать эти страницы с другими моделями, такими как теги, категории и авторы?

Вот модель страницы, которую я хочу создать:

class BlogPage(Page):

    ## Fields I can create programatically
    date = models.DateField("Post date")
    intro = models.CharField(max_length=250)
    body = RichTextField(blank=True)

    ## Fields I dont know what to do with
    tags = ClusterTaggableManager(through='BlogPageTag', blank=True)
    categories = ParentalManyToManyField('blog.BlogCategory', blank=True)
    authors = ParentalManyToManyField('blog.BlogAuthor', blank=True)

    def main_image(self):
        gallery_item = self.gallery_images.first()
        if gallery_item:
            return gallery_item.image
        else:
            return None

Вот код, который я использую для создания страницы без тегов, авторов и категорий:

    from django.core.management.base import BaseCommand
    from wagtail.models import Page
    from blog.models import BlogIndexPage, BlogPage

    class Command(BaseCommand):
        help = 'Create new Blog Page'

        def handle(self, *args, **options):

        home_page = Page.objects.type(BlogIndexPage).first()  

        new_page = BlogPage(
            title="My Page",
            slug="mypage",
            date = "2022-07-17",
            intro = "Some Intro",
            body = "Some Body",           
        )

        home_page.add_child(instance=new_page)

        new_page.save_revision().publish()

Поскольку вы использовали ParentalManyToManyFields, вы можете добавить категории и авторов в new_page перед первым сохранением.

    def handle(self, *args, **options):

        home_page = Page.objects.type(BlogIndexPage).first()  

        new_page = BlogPage(
            title="My Page",
            slug="mypage",
            date = "2022-07-17",
            intro = "Some Intro",
            body = "Some Body",           
        )
        category, created = BlogCategory.objects.get_or_create(name="Category 1")
        new_page.categories = [category]

        home_page.add_child(instance=new_page)

        new_page.save_revision().publish()

У меня нет под рукой примера тегов. Поскольку он проходит через TaggableManager, возможно, вам придется использовать add или set из https://django-taggit.readthedocs.io/en/latest/api.html

Удалось заставить его работать, основываясь на ответе от cnk:

    from django.core.management.base import BaseCommand
    from wagtail.models import Page
    from blog.models import BlogIndexPage, BlogPage
    
    class Command(BaseCommand):
        help = 'Create new Blog Page'
        
        def handle(self, *args, **options):
        
        home_page = Page.objects.type(BlogIndexPage).first()  
        
        new_page = BlogPage(
            title="My Page",
            slug="mypage",
            date = "2022-07-17",
            intro = "Some Intro",
            body = "Some Body",           
        )
        
        category, created = BlogCategory.objects.get_or_create(name="MYCATEGORY")
        new_page.categories = [category]
        
        author, created = BlogAuthor.objects.get_or_create(name="MYAUTHOR")
        new_page.authors = [author]
        
        new_page.tags.add('MYTAG')
        
        home_page.add_child(instance=new_page)
        new_page.save_revision().publish()
Вернуться на верх