Возврат всех полей с Wagtail API со страницы slug
Я создаю интерфейсное приложение VueJS, которое использует Wagtail CMS для внутреннего интерфейса и подключается через Wagtail APIV2. У меня проблема при получении информации о странице через слаг страницы. Этот запрос не будет возвращать дополнительные поля, тогда как очереди по типу страницы и идентификатору страницы будут.
Модель блога выглядит следующим образом (для краткости я опробовал несколько методов:
class BlogPage(Page):
intro = RichTextField(blank=True)
body = StreamField(blocks.CMSStreamBlock(), blank=True)
tags = ClusterTaggableManager(through=BlogPageTag, blank=True)
date = models.DateField("Post date")
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
default='',
on_delete=models.SET_NULL,
related_name='author_data',
null=True,
blank=True,
limit_choices_to=limit_author_choices
)
feed_image = models.ForeignKey(
'wagtailimages.Image',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+'
)
class Meta:
verbose_name = "Blog and Updates Page"
content_panels = [
FieldPanel('title', classname="full title"),
FieldPanel('date'),
FieldPanel('author'),
ImageChooserPanel('feed_image'),
FieldPanel('tags'),
FieldPanel('intro', classname="full"),
StreamFieldPanel('body'),
]
api_fields = [
APIField('feed_img', serializer=ImageRenditionField('width-800', source='feed_image')),
APIField('intro'),
APIField('body'),
APIField('tags'),
APIField('date'),
APIField('author')
]
Если я запрашиваю http://localhost:8000/api/v2/pages/?type=cms.BlogPage&fields=* Возвращает:
{
"meta": {
"total_count": 4
},
"items": [
{
"id": 8,
"meta": {
"type": "cms.BlogPage",
"detail_url": "http://localhost:8000/api/v2/pages/8/",
"html_url": "http://localhost:8000/en/blog/first-blog-post/",
"slug": "first-blog-post",
"show_in_menus": false,
"seo_title": "",
"search_description": "",
"first_published_at": "2017-10-18T22:54:14.709694Z"
},
"title": "First blog post",
"feed_img": {
"url": "/media/images/DSC02705.width-800.jpg",
"width": 800,
"height": 534
},
"intro": "<p>Praesent placerat in eros sit amet gravida. Curabitur nec semper ligula, sit amet egestas sapien. Nullam feugiat non mi vitae egestas. Morbi hendrerit mauris mauris, et tempor eros euismod hendrerit. Integer tempor lacus nulla, eget posuere ex dignissim quis. Donec laoreet tempor suscipit. Etiam ut purus eget turpis commodo aliquam. Donec sed maximus diam, non venenatis arcu. Sed mollis laoreet euismod.</p>",
"body": [
{
"type": "paragraph",
"value": "<p>A bunch more text in here.</p><p>Ut sit amet nisl condimentum, convallis neque eu, fringilla leo. Quisque tincidunt sed quam vel pulvinar. Maecenas vehicula pharetra volutpat. Integer velit mi, scelerisque quis lacus nec, molestie pharetra nisi. Vivamus efficitur magna vel justo lacinia tincidunt. Nam at mi accumsan, sagittis risus sed, iaculis leo. Nullam faucibus lorem a consequat varius. Etiam consectetur metus dui, et maximus turpis volutpat at. Donec vitae blandit nisi. Phasellus commodo vehicula ante vel accumsan. Fusce nec lorem urna. Pellentesque eget dapibus nibh, in ultrices felis. Curabitur felis erat, luctus eu maximus eu, pretium id lorem.</p><p>Nunc consequat, velit non consectetur laoreet, elit nisl finibus diam, id ultrices nunc quam imperdiet mi. Integer vel mi ac quam viverra pellentesque eu eu ante. Cras at est id augue hendrerit pretium ac non sem. Donec quis auctor sem, vel commodo nisi. Mauris ac tincidunt diam. Sed vel erat rhoncus, euismod nisl sit amet, tincidunt arcu. Nam a auctor lorem. Vestibulum in mauris lacus.</p><p>Duis posuere enim odio, vel lacinia nulla condimentum non. Nulla vitae pulvinar neque, sed ultricies est. Nullam fringilla id nibh imperdiet euismod. Pellentesque mauris turpis, tincidunt id commodo in, dictum a tortor. Vestibulum sit amet mollis lacus. Aenean laoreet venenatis orci. Sed nec aliquam ante. Cras congue eu urna eget faucibus. Ut lobortis convallis dictum. Donec aliquet massa sed tortor molestie, ac vestibulum eros imperdiet. Sed eget elit est. Nulla convallis, lorem ac dignissim aliquam, nisi turpis sollicitudin ipsum, vel dictum urna turpis eu orci. Morbi varius massa nisi, nec egestas massa imperdiet tempor. Morbi semper enim non condimentum bibendum. Mauris pulvinar hendrerit tincidunt.</p>",
"id": "bebd35d4-a2ad-4b82-baf1-305e817ec55e"
}
],
"tags": [
"Tag1",
"Tag2"
],
"date": "2017-10-18",
"author": {
"id": 2,
"meta": {
"type": "users.User"
}
}
},
{
"id": 9,
.....
Если я запрашиваю http://localhost:8000/api/v2/pages/8/, возвращаются все поля. Однако, если я сделаю запрос http://localhost:8000/api/v2/pages/?slug=second-blog-post&fields=*
я получил
{
"meta": {
"total_count": 1
},
"items": [
{
"id": 9,
"meta": {
"type": "cms.BlogPage",
"detail_url": "http://localhost:8000/api/v2/pages/9/",
"html_url": "http://localhost:8000/en/blog/second-blog-post/",
"slug": "second-blog-post",
"show_in_menus": false,
"seo_title": "",
"search_description": "",
"first_published_at": "2017-10-19T00:07:22.887487Z"
},
"title": "Second blog post"
}
]
}
И если я сделаю запрос http://localhost:8000/api/v2/pages/?slug=second-blog-post&fields=body, то получу
{
"message": "unknown fields: body"
}
Таким образом, кажется, что я не могу получить все поля записи из поиска слагов. Это означает, что для заполнения страницы из поиска слагов мне нужно: 1. поиск страницы с помощью слагов 2. запись идентификатора страницы 3. сделать второй вызов для извлечения поля по идентификатору страницы.
Это похоже на долгий путь. Я что-то пропустил?
1 ответ
Этот вопрос поднимается и отвечает на Wagtail Slack. Это ответ @gasman
Я думаю, проблема в том, что механизм "выборки по слагу" все еще в конечном итоге использует конечную точку API для получения списка страниц, а не одной страницы, и что он не вызывает
specific()
в наборе запросов - это означает, что доступны только основные поля страницы.Немного перенастройки вы можете настроить
PagesAPIEndpoint
класс позвонитьspecific()
- у администратора Wagtail есть внутренний API, который выполняет аналогичные действия (наряду с кучей других настроек): https://github.com/wagtail/wagtail/blob/master/wagtail/admin/api/endpoints.pyВ качестве альтернативы, вместо поиска по слагу (что немного хрупко, потому что один и тот же слаг может потенциально существовать под несколькими разными родителями), вы можете использовать новую конечную точку 'find', добавленную в Wagtail 2.1: http://docs.wagtail.io/en/v2.1/advanced_topics/api/v2/usage.html
К сожалению, в его нынешнем виде он все еще будет включать в себя избыточную обратную связь с API, потому что он работает на перенаправлении, но это сэкономит вам немного кода по крайней мере...