概要Djangoで、ブログを作るシリーズ1の1つです。ブログのコメント・返信ページを作っていきます。コメント投稿機能urls.pyに、コメント投稿ページの定義を追加します。name='post_detail')'forms.py'を開き、コメント作成用のモデルフォームを作ります。'マークダウンに対応しています。}どの記事に紐づくかのtargetはビュー側で設定するので、excludeに指定して除外しておきましょう。作成日(created_at)も自動で現在時間が入るようにしているので、除外です。widgets属性で何をしているかというと、入力欄のプレースホルダに次のように表示しているのです。マークダウンに対応しています。```pythonprint("コードはこのような感じで書く")```[リンクテキスト](https://narito.ninja/)[画像alt](画像URL)マークダウンの書き方を簡単にユーザーに知らせているだけですね。このフォームを使うように、コメントのビューを作ります。"""記事へのコメント作成ビュー。contextコメントを作成したいので、CreateViewを基に作成します。上書きして、テンプレートファイルに記事モデルインスタンスを渡すようにしたり、コメントのtargetフィールドをビュー側で設定していたりします。見ると、やっていることは単純です。コメント投稿ページとなる、comment_form.htmlを作ります。%}記事詳細ページのリンクも修正しましょう。post_detail.htmlです。rel="nofollow">記事にコメントする</a></p>style.cssを開き、コメントフォーム関連の見た目を整えます。100%;}すると、無事にコメントが投稿できるようになります。コメントへの返信機能コメントへの返信機能も作っていきましょう。urls.pyを開いて追加します。name='reply_create'),リプライ用のもモデルフォームも作成します。forms.pyです。'マークダウンに対応しています。}CommentFormと、殆ど同じです。リプライ用のビューを作ります。"""コメントへの返信作成ビュー。contextこれも先ほどと殆ど同様ですが、self.kwargs['pk']がコメントのpkということ、Replyのtargetには対象となるコメントを指定する必要があることに注意です。post_detail.htmlを開き、返信リンクを修正します。rel="nofollow">返信する</a>コメントのメールお知らせ機能コメントが来たときに、メールで通知してくれると親切ですね。そんなわけで、メール通知機能を実装していきます。settings.pyに次の記述をしておきます。メールをコンソールに表示する。'toritoritorina@gmail.com'これはメールをコンソールに表示します。開発中の確認には便利です。実際にメールを送信してみたい方は、Djangoで、メールを送信も参考にしてください。今回はせっかくなので、シグナルを使って通知機能を実装しましょう。apps.pyを変更します。シグナルのロードをする。signalssignals.pyを作成します。passこれで、Commentモデルがpost_save...保存された後のことですが、その際この関数が呼ばれるようになります。後はメールを自分に送信したいのですが、その前に少し仕込みをします。views.pyを編集します。"""記事へのコメント作成ビュー。pk=post_pk)何を変更したかというと、CommentCreateビューのform_valid内です。self.requestというコードを追加しています。モデルインスタンスにrequest属性を設定しています。こんなことをしているかというと、send_mail_to_author関数内でrequestオブジェクトを使いたいのですが、シグナルにはrequestオブジェクトが自動で渡されないのです。send_mail_to_author関数が呼ばれる前、save()の手前でrequestオブジェクトをモデルインスタンスに持たせます。モデルインスタンスはシグナルに渡されるので、間接的にrequestオブジェクトをシグナルに渡すことができます。singnals.pyを編集します。views.py側で、requestオブジェクトをインスタンスに格納しています。recipient_list)createdは、更新ではなく新規作成の場合にTrueです。新規作成のときだけメールですね。instanceは、コメントのモデルインスタンスです。メールを送信するのに、テンプレートファイルを使っています。templates/nblogにmailディレクトリを作ります。その中に、まずは題名のcomment_notify_subject.txtを作ります。改行が混じらないように注意しましょう。コメントが届きました。comment_notify_message.txtを作ります。コメントが投稿されました。以下のURLからご確認ください。%}requestオブジェクトが使えるので、URLを柔軟に作成できます。コメントを作成したときに、次のようなメールがコンソールが表示されれば成功です。コメントが投稿されました。以下のURLからご確認ください。返信があったときに、コメント者にその旨伝えるようにしたいと思います。私のブログだとプログラミングの質問が多いので、解答したときにそれを伝える必要があったのです。Commentモデルにメールアドレスのフィールドを持たせます。help_text='入力しておくと、返信があった際に通知します。コメント欄には表示されません。')makemigrationsとmigrateをしておきます。あとは、Replyが作成されたときにシグナルを使い、このemail;フィールド宛にメールを送信すれば良さそうですね。views.pyのReplyCreateViewに少し追加をします。"""コメントへの返信作成ビュー。pk=comment.target.pk)コメント同様に、リプライにもrequestオブジェクトを持たせておきます。signals.pyで、リプライ作成時のメール送信処理を作りましょう。views.py側で、requestオブジェクトをインスタンスに格納しています。email.send()コメントのお知らせメール送信処理をと殆ど同じです。今回はbccを使って管理者にもお知らせするようにしたいので、EmailMessageを使ってメールを送信します。あなたのコメントに返信が届きました。コメントに返信がありました。以下のURLからご確認ください。%}コメントした人が、自分のコメントに自分で返信した場合はどうでしょう。その場合はおそらく、返信のお知らせメールはしなくて良いでしょう。これはセッションを使って管理できます。instance.requestの下に、追加します。comment.email部分を書き換えます。recipient_list.append(comment.email)コメントにCaptcha機能コメント欄は何も対策しないと、全く関係のないスパムコメントで溢れかえります。私のブログでは、「いぬを漢字で書いてください」といったフィールドを用意して、これに正解しないとコメントができません。日本人からすると非常に簡単ですが、海外からのスパムコメント対策としては、めちゃくちゃ有効に働いています。海外の一般のユーザーが恐らくコメントできなくなるので、最近はちょっと見直そうかなとも思ってますが、とりあえずこれは実装しましょう。アプリケーション内に、fields.pyを作ります。中身は次のようにしておきましょう。forms.ValidationError('答えが違います!')forms.pyを開き、コメントとリプライの投稿では、このSimpleCaptchaFieldを使うようにします。PostsDjangoで、シンプルなCaptchaフィールドの作成コメント欄等のスパム対策として、Djangoのフォームフィールドを自分で作り、シンプルなCaptchaフィールドを実装します。DjangoカスタムウィジェットDjangoで、メールを送信Djangoでメールを送信する、基本的なやり方を説明していきます。EmailDjangoで、ブログを作るシリーズ1Djangoでブログを作っていくシリーズです。シリーズ・まとめComment記事にコメントするまだコメントはありません。幾つかの方法で、ブログの更新を受け取れます。