
前の記事では、フォーラムに投稿編集機能を追加し、ユーザーが公開したコンテンツを修正できるようにしました。
投稿以外にも、フォーラムではインタラクションが不可欠です。ユーザーは興味深い(あるいは物議を醸す)投稿を見たときに、自分の意見を表明したくなるでしょう。
この記事では、フォーラムにインタラクション機能を追加します。投稿のコメントと返信を実装し、ユーザーが投稿を中心に議論できるようにします。
ステップ1:データベースモデルの更新
コメントを保存するための新しいテーブルが必要です。さらに、コメント自体が階層構造を形成するために返信をサポートする必要があります。
models.pyで、Commentモデルを追加し、リレーションシップを確立するためにUserおよびPostモデルを更新します。
models.py(更新版)
ここで行った主な変更点は次のとおりです。
Commentモデルを作成し、それぞれpost_idおよびowner_idを介して投稿およびユーザーにリンクしました。parent_idフィールドは、別のコメントのidを指します。NULLの場合はトップレベルのコメントであり、それ以外の場合は返信です。UserおよびPostモデルを更新し、Commentへのリレーションシップを追加しました。cascade="all, delete-orphan"は、ユーザーまたは投稿が削除されたときに、関連するコメントも削除されることを保証します。
次に、この新しいテーブルをデータベースに作成します。対応するSQLステートメントは次のとおりです。
Leapcellを使用してデータベースが作成された場合、
これらのSQLステートメントを、Webベースの操作パネルで直接実行できます。
ステップ2:投稿詳細ページとコメントセクションの作成
現在、すべての投稿はホームページに表示されています。コメントセクションのためのスペースを確保するために、各投稿に個別の詳細ページを作成する必要があります。
まず、templatesフォルダに新しいファイルpost_detail.htmlを作成します。
templates/post_detail.html
このテンプレートには、投稿の詳細、新しいコメントを投稿するためのフォーム、およびすべてのコメントを表示する領域が含まれています。簡単にするために、現在は1レベルの返信のみを表示しています。
ステップ3:バックエンドルートロジックの実装
次に、投稿詳細ページを表示し、コメントを送信するための新しいルートをmain.pyに追加します。
main.py(新しいルートを追加)
2つの新しいルートを追加しました。
GET /posts/{post_id}:post_idに基づいてデータベースから投稿を検索し、その投稿に関連するすべてのコメントをクエリします。最後に、post_detail.htmlテンプレートをレンダリングし、投稿、コメント、および現在のユーザー情報を渡します。POST /posts/{post_id}/comments: このルートは、コメントと返信の送信を処理し、Commentオブジェクトを作成してデータベースに保存します。フォームからcontentとオプションのparent_idを受け取ります。parent_idが存在する場合、これは返信を意味します。
ステップ4:ホームページにエントリポイントを追加
すべて準備ができたので、ホームページから投稿詳細ページへのエントリポイントが必要です。templates/posts.htmlを編集して、投稿タイトルをリンクに変換します。
<h3>{{ post.title }}</h3>を/posts/{{ post.id }}にリンクする<a>タグでラップするだけです。
templates/posts.html(更新版)
実行と検証
uvicornサーバーを再起動します。
http://127.0.0.1:8000にアクセスしてログインします。ホームページでは、すべての投稿タイトルがクリック可能なリンクになっていることがわかります。
いずれかの投稿タイトルをクリックすると、ページがその投稿の詳細ページにリダイレクトされます。
詳細ページの最下部にあるコメントボックスにコンテンツを入力して、「Submit」をクリックします。ページがリフレッシュされた後、コメントがコメントセクションに表示されます。
コメントの下に、より小さな返信ボックスがあります。そこにコンテンツを入力して送信すると、コメントが返信として表示されます。
まとめ
フォーラムは現在、コメントと返信機能をサポートしており、ユーザーが互いに交流できるようになりました。
フォーラムの機能が複雑になるにつれて、コミュニティの秩序を維持することがますます重要になります。ユーザーができることをどのように制御しますか?
次の記事では、権限管理を紹介します。管理者などのシステムを通じて、コミュニティの健全な発展を確保します。たとえば、ユーザーの発言を禁止することです。
Xでフォローする:@LeapcellJapan
関連記事:
