はじめに
こんにちは。
現在実装したい内容はページ編集後の保存時のバリデーション設定です。
タイトルが33文字を超えた時の挙動をタイトルが0文字だった時の挙動と同じにしたいのです。
実装方法を調査するために、今回はWagtailのコードを調査してみました。
前回の記事
Wagtailのソースコードをチェックする
Wagtailはオープンソースなので、ネットで「Wagtail Github」と検索すればWagtailのGithubページがヒットします。
ページ保存時にどのコードが関わっているのかが知りたいので、とりあえずコード内検索にかけてみましょう。
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.")
実行結果はこんな感じです。
データベースの保存バリデーションとエラーメッセージの両方が実装できましたね。
さいごに
ガキ使見ながらやっていたら年を越してしまいました。-_-
wagtailではMarkDownで記事が書けるらしいので、それの実装でもしてみようかなと思います。