Django/wagtail : почему моя страница не передает переменную pk?

Я пытаюсь заставить работать предварительный просмотр в wagtail с react frontend и djangorestframework, обслуживающим его.

У меня предварительный просмотр работает правильно, если вручную изменить передаваемый url и поставить правильный идентификатор pk, который изначально является None.

Мой вопрос в том, почему в классе PostPage в функции get_preview_url неправильно устанавливается pk?

Вот код

class PostPage(BasePage):
    serializer_class = "blog.serializers.PostPageSerializer"

    header_image = models.ForeignKey(
        "wagtailimages.Image",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="+",
    )

    body = StreamField(BodyBlock(), blank=True)

    tags = ClusterTaggableManager(through="blog.PostPageTag", blank=True)

    content_panels = Page.content_panels + [
        ImageChooserPanel("header_image"),
        InlinePanel("categories", label="category"),
        FieldPanel("tags"),
        StreamFieldPanel("body"),
    ]

    search_fields = Page.search_fields + [
        index.SearchField('title'),
        index.SearchField('body'),
    ]
    api_fields = ( 
    APIField(
    "header_image_url",
    serializer=ImageRenditionField("max-1000x800", source="header_image"), 
    ),
    "body",
    APIField("owner"),
    APIField("api_categories", serializer=CategoryField(source="categories")),#check if categories retrieved
    APIField("api_tags", serializer=TagField(source="tags")), 
    #APIField("pub_date",serializer=DateTimeField(format="%d %B %Y", source="first_published_at")),
    )
    def get_preview_url(self, token): 
        return urllib.parse.urljoin(self.get_client_root_url(), 
                                    f"post/{self.pk}/"
                                    + "?"
                                    + urllib.parse.urlencode({"content_type": self.get_content_type_str(), "token": token}),
                                    )
    def serve(self, request, *args, **kwargs): 
        return HttpResponseRedirect(urllib.parse.urljoin(self.get_client_root_url(), f"/post/{self.pk}") )
        

А вот класс BasePage, который наследуется в PostPage:

class BasePage(HeadlessPreviewMixin, Page):

    serializer_class = None

    class Meta:
        abstract = True

    def get_component_data(self):
        if not self.serializer_class:
            raise Exception(f'serializer_class is not set {self.__class__.__name__}')

        serializer_class = import_string(self.serializer_class)

        return {
            'page_type': self.__class__.__name__,
            'page_content': serializer_class(self).data
        }

    def categories_list(self, context):
        categories = BlogCategory.objects.all()

        blog_page = context['blog_page']
        data = [{
            'name': category.name,
            'slug': category.slug,
            'url': blog_page.url + blog_page.reverse_subpage(
                "post_by_category",
                args=(
                    category.slug,
                )
            )
        } for category in categories]

        return data

    def tags_list(self, context):
        tags = Tag.objects.all()

        blog_page = context['blog_page']
        data = [{
            'name': tag.name,
            'slug': tag.slug,
            'url': blog_page.url + blog_page.reverse_subpage(
                "post_by_tag",
                args=(
                    tag.slug,
                )
            )
        } for tag in tags]

        return data

    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request)
        context['page_component'] = self.get_component_data()

        if 'blog_page' not in context:
            context['blog_page'] = BlogPage.objects.first()
        context['page_component']['categories_list'] = self.categories_list(context)
        context['page_component']['tags_list'] = self.tags_list(context)
        return context

    def serve(self, request, *args, **kwargs):
        if request.content_type == 'application/json':
            context = self.get_context(request, *args, **kwargs)
            return JsonResponse(context['page_component'])
        else:
            full_path = request.get_full_path()
            return HttpResponseRedirect(urllib.parse.urljoin(settings.REACT_APP_BASE, full_path))

Я не вижу никакого pk в обоих классах, так что я предполагаю, что он исходит из класса Page или HeadlessPreviewMixin, но я не знаю, где искать, чтобы исследовать. Обычно я привык видеть pk в коде React в props или state компонентов, но я не вижу, как он передается в переменную django python

Спасибо

Значение для pk будет получено из Page, поскольку поле page id является первичным ключом. Однако, пока страница не будет сохранена, значение для id не будет существовать. id создается из последовательности или автоинкрементного поля вашей базы данных в процессе сохранения страницы.

Вернуться на верх