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 создается из последовательности или автоинкрементного поля вашей базы данных в процессе сохранения страницы.