iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
0
自我挑戰組

Django CMS框架 - Wagtail筆記系列 第 3

[Day 3] Wagtail Page詳解

  • 分享至 

  • xImage
  •  

Page

Page實際上是繼承models,所以任何使用在models裡面的欄位都可以使用,讓我們先回到models.py來看看我們剛剛做了什麼


class HomePage(Page):
    body = RichTextField(blank=True) 
    
    content_panels = Page.content_panels + [
        FieldPanel('body',classname="full"),
    ]

在這裡我們定義了一個欄位 - body,他的型態是RichTextField,他是Wagtail定義的欄位,我們來看看官網的文件

RichtextField - For rich text content

很好,有看沒有懂

它其實是存取WYSIWYG editor的內容(也就是你在後台介面的那個Body欄位所使用的Editor)

配合在html裡面所使用的模板語言

{{ page.body|richtext }}

會把存在資料庫裡面的內容,轉換成你在後台介面輸入時看到的樣子

接下來,我們看看下面這個例子

class BlogPage(Page):

    # Database fields
    template = 'other_template.html'
    
    body = RichTextField()
    date = models.DateField("Post date")
    feed_image = models.ForeignKey(
        'wagtailimages.Image',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+'
    )


    # Search index configuration

    search_fields = Page.search_fields + [
        index.SearchField('body'),
        index.FilterField('date'),
    ]


    # Editor panels configuration

    content_panels = Page.content_panels + [
        FieldPanel('date'),
        FieldPanel('body', classname="full"),
    ]

    promote_panels = [
        MultiFieldPanel(Page.promote_panels, "Common page configuration"),
        ImageChooserPanel('feed_image'),
    ]


    # Parent page / subpage type rules

    parent_page_types = ['blog.BlogIndex']
    subpage_types = []
    
    def get_context(self, request):
        context = super().get_context(request)
        return context

search_fields

search_fields的目的是當實作Wagtail search的時候所要搜尋的欄位

在這個例子中,body和date兩個欄位都會建立index,但作search的時候實際上只會比對SearchField,而FilterField則是讓使用者可以對搜尋結果做Filter。

關於search功能之後會再進行詳述。

content_fields

相對search_fields,content_fields則是決定提供什麼欄位在後台提供填寫。

promote_panels

給meta data使用的,比如說page的tag,或者該page的代表圖片

parent_page_types, subpage_types

他的父頁面和子頁面限制是哪些,避免使用了不該使用的page當作他的相關頁面

getContext(self, request)

他跟Django的class based view概念一樣,可以藉由複寫getContext可以新增要顯示的資料到要傳給頁面的字典中。

template

同樣的,如果不想使用它默認的html檔名,可以用template這個變數來更改使用的html檔案。

或者覆寫get_template動態選擇要使用的template

serve(self, request)

每個page都有serve這個方法來調動getContext和getTemplate來進行最後page的render,如果想要把顯示頁面,改成顯示json的話,可以覆寫serve如下


def serve(self, request):
        return JsonResponse({
            'title': self.title,
            'body': self.body,
            'date': self.date,
            'feed_image': self.feed_image.get_rendition('width-300').url,
        })

###對Page進行CRUD

由於Page是一種model,所以平常對model進行的操作方法基本上都可以使用

BlogPage.objects.all()

或者

BlogPage.objects.filter(title='hello')

因為Page算是Wagtail裡面最重要的東西,
今天花了一篇來解釋他,希望大家看得懂。


上一篇
[DAY 2] 寫出Wagtail的第一個網頁
下一篇
[Day 4] 建立自訂義的頁面
系列文
Django CMS框架 - Wagtail筆記7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言