1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Wagtailを触ってみた(3)。ポップアップメッセージの調査、実装。

Posted at

はじめに

こんにちは。

現在実装したい内容はページ編集後の保存時のバリデーション設定です。
タイトルが33文字を超えた時の挙動をタイトルが0文字だった時の挙動と同じにしたいのです。

実装方法を調査するために、今回はWagtailのコードを調査してみました。
前回の記事


Wagtailのソースコードをチェックする

Wagtailはオープンソースなので、ネットで「Wagtail Github」と検索すればWagtailのGithubページがヒットします。
ページ保存時にどのコードが関わっているのかが知りたいので、とりあえずコード内検索にかけてみましょう。

スクリーンショット 2019-12-31 19.59.15.png スクリーンショット 2019-12-31 20.00.25.png

django.poファイルが多くヒットしますね。これはページ内で使われている言葉を別言語に変換するためのファイルです。
このファイルは今回の内容とは深く関わらないと思うので、飛ばします。

wagtail/admin/views/pages.pyが怪しそうですね。
このファイル内でもエラーメッセージを検索して、それがどの関数で使われているのかを調べてみます。

どうやら、323行目のedit関数がそれっぽい感じを出しています。
create関数とedit関数は似ていますね。名前から推察するにページを作成した時と編集した時で動く関数が違うのかなぁ。(そうみたいです)

エラーメッセージが書かれているところはここですね。

messages.validation_error(request, _("The page could not be saved due to validation errors"), form)

messagesはファイルの冒頭のimport文を見ると、

from wagtail.admin import messages, signals

wagtail/admin/messages.pyのことだとわかりますね。
色々関数が書かれていますけど、大体はrender関数に処理が移行するみたいです。

def render(message, buttons, detail=''):
    return render_to_string('wagtailadmin/shared/messages.html', {
        'message': message,
        'buttons': buttons,
        'detail': detail,
    })

wagtailでページの上部に出てくるバナー(?)メッセージを出すためには、このmessagesを使えばいいことがわかりました。


messagesメソッドを導入する

では、messagesメソッドを導入していきます。
これまで検討してきたやり方は、models.pyのsaveメソッドで保存時にバリデーションをかけるということです。
この手法では、データベースに保存するかどうかは設定できます。しかし、エラーメッセージの対応は難しいようです。
エラーメッセージを出すために、今回はhooksを使いたいと思います。

hooksはwagtail特有の便利な関数で、ある特定のイベントが発生した時にプログラムを実行する、ということが可能です。
Pageオブジェクトが編集される前や後、Pageオブジェクトが作成される前や後などもhooksは対応しています。
というわけで、Pageオブジェクトが編集された後のhooksを使ってみようと思います。

from django.http import HttpResponse
from wagtail.core import hooks

from wagtail.admin import messages

@hooks.register('after_edit_page')
def after_edit_page(request, page):
    is_title_length_valid = True if (len(page.title) > 0 | len(page.title) < 33) else False
    
    if not is_title_length_valid:
        messages.error(request, "Title Count Error")
    

def index(request):
    return HttpReesponse("Hello, world.")

実行結果はこんな感じです。

スクリーンショット 2020-01-01 0.25.09.png

データベースの保存バリデーションとエラーメッセージの両方が実装できましたね。


さいごに

ガキ使見ながらやっていたら年を越してしまいました。-_-
wagtailではMarkDownで記事が書けるらしいので、それの実装でもしてみようかなと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?