お疲れ様です、tomaです。
前回の「レポート2.5」では、ToDoアプリの実装を通じてフレームワークの実用性をテストしました。
そこで得た知見と、湧き上がってきた「もっと楽をしたい」という欲求に従い、今回はフレームワークの心臓部である 管理画面(Admin UI) に、決定的な進化をもたらしました。
今回のテーマは 「宣言的UI」 と 「黒い画面(CLI)の整備」 です。
Rustのマクロという魔導書を書き換えることで、Djangoの admin.py や forms.py に限りなく近い開発体験を実現した記録を残します。
1. ボイラープレートの終焉:Generic ModelForm
これまで、新しいモデル(テーブル)を追加するたびに、HTMLフォームの定義や変換ロジックを手動で書いていました。
しかし、Djangoユーザーならこう思うはずです。「モデルがあるなら、フォームは勝手にできてほしい」と。
そこで、新たなマクロ impl_model_form! を実装しました。
- 自動生成:SeaORMのモデル定義から、入力フォーム (
FromForm) を自動生成します。 - ウィジェット制御:
widget: passwordやwidget: textareaと指定するだけで、HTML側の input タグが適切に切り替わります。 - Many-to-Many対応:面倒な中間テーブルの保存処理(
m2m属性)も、マクロが裏側で処理します。
これにより、開発者は「どんなデータが欲しいか」を宣言するだけで、堅牢な入力フォームを手に入れることができるようになりました。
2. テンプレートの統一:千の顔を持つ form.html
以前は user_form.html、group_form.html とモデルごとにテンプレートファイルを作成していましたが、これは明らかに無駄でした。
今回のアップデートで、これらを単一の admin/form.html.tera に統合しました。
仕組みはこうです:
バックエンドから「このフィールドはテキスト、あっちは日付」というメタデータ(FieldMetadata)を注入し、テンプレート側でそれを解釈して動的にレンダリングします。
これにより、新しい管理画面を追加する際、HTMLを一行も書く必要がなくなりました。
3. 検索機能の実装:impl_list_view!
管理画面にデータが並ぶと、次に欲しくなるのは「検索」です。
ここでも宣言的なアプローチを採用しました。
search_fields: [Name, Description]マクロにこのように記述するだけで、汎用的な検索バーが有効になり、SQLの LIKE 検索クエリが自動的に発行されます。
Djangoの search_fields = ['name'] と全く同じ感覚です。
4. CLIツールの召喚:createsuperuser
Webブラウザの外側にも装備を整えました。
開発初期や運用時に必須となる管理者ユーザーの作成。これまではSQLを直接叩いていましたが、ついにCLIツールを実装しました。
cargo run -- createsuperuser技術的には clap で引数を解析し、rpassword でパスワードを安全に入力(エコーバックなし)、そして argon2 でハッシュ化して保存しています。
「コマンド一発で管理者が作れる」。地味ですが、フレームワークとしての体裁がグッと整いました。
5. まとめ:パズルが組み上がってきた
今回の改修で、管理画面の開発工数は当初の1/10以下になった感覚です。
「モデル定義」と「数行のマクロ記述」だけで、検索付きの一覧画面と、バリデーション付きの編集フォームが立ち上がる。
Rustの型安全性とパフォーマンスを維持したまま、この生産性を手に入れられたのは大きな成果です。
次なる課題は、バリデーションエラー表示のさらなるリッチ化や、マクロの内部構造(proc-macro化)の改善です。
理想のWebフレームワークへの道はまだ続きますが、足取りは確実に軽くなっています。
それでは、また次のセーブレポートで。
toma