宿題:コメントモデルを作ろう

現在、ポストモデルしかありません。 あなたの読者からいくつかのフィードバックを受け取り、彼らにコメントさせるのはどうでしょうか?

ブログにコメントモデルを作る

blog/models.pyを開き、このコードをファイルの最後に追加しましょう:

class Comment(models.Model):
    post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name='comments')
    author = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    approved_comment = models.BooleanField(default=False)

    def approve(self):
        self.approved_comment = True
        self.save()

    def __str__(self):
        return self.text

各フィールドタイプの意味を思い出す必要がある場合は、チュートリアルのDjangoモデルの章に戻ることができます。

拡張版チュートリアルでは、新しいフィールドタイプが登場します:

  • models.BooleanField - こちらはtrue/falseの値が入るフィールドです。

models.ForeignKeyrelated_name引数は、ポストモデルの中からコメントにアクセスできるようにします。

データベースにモデルのテーブルを作る

今度は、コメントモデルをデータベースに追加します。 これを行うには、モデルを変更したことをDjangoに伝えなければなりません。 コマンドラインに python manage.py makemigrations blogと入力してください。 次のような出力が表示されます:

このコマンドがblog/migrations/ディレクトリに別のマイグレーションファイルを作成したことがわかります。 コマンドラインで python manage.py migrate blogとタイプして変更を適用する必要があります。 出力は次のようになります:

コメントモデルは今データベースに存在します! 管理画面でアクセスできたら素敵ですよね?

管理画面にコメントモデルを登録する

管理画面にコメントモデルを登録するため、blog/admin.pyファイルに以下の行を追加してください:

追加する位置は、この行の直下です:

コメントモデルをファイルの先頭でインポートすることも忘れないようにしてください:

コマンドラインでpython manage.py runserverを入力し、あなたのブラウザで http://127.0.0.1:8000/admin/ に行くと、コメントリストにアクセスすることができ、コメントの追加と削除の機能が使えるようになります。新しいコメント機能で遊んでみましょう!

コメントを見えるようにする

blog/templates/blog/post_detail.htmlというファイルを開き、{% endblock %}

タグの前に、以下の行を追加してください:

これで投稿の詳細ページでコメントを見ることができます。

でも、コメントをもう少し良く見せられるかもしれませんね。 static/css/blog.cssファイルの一番下にいくつかのCSSを追加しましょう:

投稿一覧ページでコメントについて、訪問者に知らせることもできます。 blog/templates/blog/post_list.htmlファイルを開き、次の行を追加します:

追加したら、テンプレートは次のようになります:

読者がコメントを書けるようにする

今は私たちのブログでコメントを見ることができますが、追加することはできません。 それを変えましょう!

blog/forms.pyを開き、以下の行をファイルの最後に追加します:

コメントモデルをインポートすることを忘れないでください。以下の行を変更して:

このようにします:

今度は、blog/templates/blog/post_detail.htmlを開き、{% for comment in post.comments.all %}の前に以下の行を追加します:

もし投稿詳細ページに行くと、以下のエラーが表示されます:

NoReverseMatch

私たちはそれを修正する方法を知っています! blog/urls.pyを開き、このパターンをurlpatternsに追加してください:

ページを更新したら、また違うエラーが出てきます!

AttributeError

こちらのエラーを修正するために、blog/views.pyに以下のビューを追加してください:

CommentFormをファイルの先頭でインポートすることを忘れないでください:

今、詳細投稿ページで”Add Comment”というボタンが表示されています。

AddComment

しかし、そのボタンをクリックしたら、次のように表示されます:

TemplateDoesNotExist

表示されたエラーが伝えているように、テンプレートは存在していないので、blog/templates/blog/add_comment_to_post.htmlという新しいテンプレートを作り、以下のコードを追加してください:

わーい! 今あなたの読者は、ブログの投稿をどう思っているかを知らせることができます!

コメントを管理する

すべてのコメントを表示する必要はありません。 ブログの所有者として、あなたはコメントを承認または削除する選択肢をおそらく望むでしょう。 それについて何かしましょう。

blog/templates/blog/post_detail.htmlを開き、以下の行を:

このように変更してください:

comment_remove comment_approveパターンに一致するURLがまだないので、 NoReverseMatchが表示されます。

こちらのエラーを修正するため、以下のURLパターンをblog/urls.pyに追加してください:

さて、あなたにはAttributeErrorが見えています。このエラーを修正するために、以下のビューをblog/views.pyに追加してください:

ファイルの先頭に Commentをインポートする必要があります:

すべて動作します!私たちにできる小さな微調整があります。投稿一覧ページ(の投稿の下)には、現在、投稿が受け取ったすべてのコメントの数が表示されます。承認された コメントの数を表示するように変更しましょう。

これを修正するには、 blog/templates/blog/post_list.htmlを開き、次の行を:

下記のように変更してください:

最後に、このメソッドを blog/models.py Postモデルに追加してください:

これでコメント機能は終了です! おめでとう! :-)

Last updated

Was this helpful?