Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 从page slug返回带有Wagtail API的所有字段_Django_Wagtail - Fatal编程技术网

Django 从page slug返回带有Wagtail API的所有字段

Django 从page slug返回带有Wagtail API的所有字段,django,wagtail,Django,Wagtail,我正在创建一个VueJS前端应用程序,它使用Wagtail CMS作为后端,并通过Wagtail APIV2进行连接。我遇到的问题是当通过页面slug检索页面信息时。此查询不会返回其他字段,而将返回按页面类型和页面id列出的查询 博客模型如下所示(为了简洁起见,我修改了一些方法: class BlogPage(Page): intro = RichTextField(blank=True) body = StreamField(blocks.CMSStreamBlock(), b

我正在创建一个VueJS前端应用程序,它使用Wagtail CMS作为后端,并通过Wagtail APIV2进行连接。我遇到的问题是当通过页面slug检索页面信息时。此查询不会返回其他字段,而将返回按页面类型和页面id列出的查询

博客模型如下所示(为了简洁起见,我修改了一些方法:

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')
    ]
如果我查询*它返回:

{
    "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,
    .....
如果我质疑,我会得到

因此,我似乎无法从段塞查找中检索所有记录字段。这意味着要从段塞查找中填充页面,我需要: 1.通过slug查找页面 2.记录页面ID 3.再次调用以按页面ID检索字段


这似乎有很长的路要走。我遗漏了什么吗?

这个问题是在上提出和回答的。这是@gasman的答案

我认为问题在于“通过slug获取”机制最终仍然使用API端点获取页面列表,而不是单个页面,并且没有在queryset上调用
specific()
,这意味着只有核心页面字段可用

通过一点重新设计,您可以定制
PagesAPIEndpoint
类来调用
specific()
——Wagtail管理员有一个内部API,它可以做类似的事情(以及一系列其他定制):

或者,您可以使用Wagtail 2.1中添加的新“查找”端点,而不是通过slug查找(这有点脆弱,因为同一slug可能存在于多个不同的父项下):

不幸的是,在它当前的形式中,它仍然会涉及到一个到API的冗余往返,因为它可以在重定向上工作,但它至少会为您节省一些代码


感谢您在allcaps中添加此内容-请告诉我!不过,答案由@mattwestcott.See提供(可能是为了回答关于Slack的原始问题而编写的)
{
    "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"
        }
    ]
}
{
    "message": "unknown fields: body"
}