
前の記事で、フォーラムに画像アップロード機能を追加し、投稿のコンテンツを充実させました。
現在、すべての投稿が同じホームページフィードに混在しています。フォーラムのコンテンツが増えるにつれて、これは非常に整理が悪くなります。ユーザーは特定のトピックにのみ興味があるかもしれませんが、関係のないコンテンツに気を取られてしまいます。
これを解決するために、この記事ではカテゴリ機能を紹介します。「技術的な議論」「雑談」などのさまざまなボードを作成し、ユーザーが投稿時にカテゴリを選択できるようにし、カテゴリ別に投稿を閲覧できるようにします。
ステップ1:データベースモデルの更新
カテゴリ情報を保存するために新しいテーブルcategoriesが必要であり、それをリンクするためにpostsテーブルに外部キーを追加する必要があります。
models.pyを開き、Categoryモデルを追加し、Postモデルを更新します。
models.py(更新後)
このステップでの主な変更点は次のとおりです。
- 新しい
Categoryモデルを作成しました。 Postモデルにcategory_idを外部キーとして追加しました。PostとCategoryの間のrelationshipを確立し、post.categoryまたはcategory.postsを介してカテゴリ情報にアクセスできるようにしました。
ステップ2:データベーステーブル構造の更新
次に、このテーブルをデータベースに実際に作成し、postsテーブルを変更する必要があります。
categoriesテーブルの作成
デフォルトカテゴリの作成
カテゴリをすぐに利用できるように、手動で2つ作成しましょう。
postsテーブルの変更
既存の投稿の処理
postsテーブルの既存のデータについては、デフォルトのcategory_idを割り当てる必要があります。
Null不可に設定
最後に、データ整合性を確保するために、category_id列をNOT NULLに設定します。
Leapcellを使用してデータベースを作成した場合、
これらのSQLステートメントをWebベースの操作パネルで直接実行できます。
ステップ3:投稿作成ロジックの更新
これで、ユーザーが投稿を作成する際にはカテゴリを指定する必要があります。create_postルートを変更してcategory_idを受け入れるようにする必要があります。
main.py(create_postルートの更新)
ステップ4:カテゴリ別閲覧の実装
/postsを唯一の投稿リストページとして使用するのではなく、特定のカテゴリの投稿を表示する新しいルートGET /categories/{category_id}を作成します。
既存のGET /postsルートを、「すべての投稿」集計ページとして機能するように変更します。
main.py(ルートの追加/変更)
新しいルートGET /categories/{category_id}を追加しました。これはposts.htmlテンプレートを再利用しますが、そのカテゴリの投稿のみを渡します。また、GET /postsルートを変更し、カテゴリ情報が正しくロードされて渡されるようにしました。
ステップ5:フロントエンドテンプレートの更新
最後に、カテゴリナビゲーションを表示し、投稿時にカテゴリを選択できるようにし、投稿がどのカテゴリに属するかを示すためにテンプレートを更新する必要があります。
templates/posts.html(更新後)
templates/post_detail.html(更新後)
投稿詳細ページでも、カテゴリ情報を追加します。
実行と検証
uvicornサーバーを再起動します。
http://127.0.0.1:8000/にアクセスします。
上部に新しいカテゴリナビゲーションバー(「すべて」、「Technical」、「General」)が表示されます。
「新しいスレッドを投稿」フォームには、新しく必須の「カテゴリを選択」ドロップダウンがあります。
投稿リストでは、各投稿がどのカテゴリに属しているかを示します。
カテゴリ(例:「General」)をクリックしてみてください。ページは/categories/2にリダイレクトされ、そのカテゴリの投稿のみが表示され、フォームの「カテゴリを選択」ドロップダウンは「General」にデフォルト設定されます。
結論
Categoryモデルを追加し、ルートとテンプレートを更新することで、フォーラムのカテゴリ機能を正常に実装しました。これにより、ユーザーがフォーラムのコンテンツを見つけて閲覧することがより便利になりました。
Xでフォローする:@LeapcellJapan
関連記事:
