Djangoで自作ブログ(CMS)を作る方法|コメント機能も作るよ

スポンサーリンク

今回は、DjangoのBlogアプリを作成します。

初心者のために、Django で独自のブログアプリケーションを作る前に、ブログとは何かという簡単な基本を確認しましょう。

スポンサーリンク

ブログってなんだろう?

ブログサイトは、あらゆる情報を個別かつ有益なテキスト形式のエントリ(投稿)で公開するオンラインプラットフォームです。

さらに、人々は各ブログのコメント欄でクエリを共有し、意見を交換することができます。

ブログアプリケーションは、 Django フレームワークを実践するための優れた方法です。

これから、閲覧者が利用できるブログアプリケーションを作成します。

  • 全てのブログのリストを見る
  • 各ブログの投稿を見る
  • 各ブログの記事に存在するコメント欄にコメントします。
  • 特定のブログ記事を検索する

Django ブログを構築するための前提条件

このアプリケーションでは、以下の知識が必要です。

  • Django のモデル
  • Django のビュー
  • Django の URL
  • Django テンプレート
  • Django フォーム

もし、これらのセクションに馴染めないと感じたら、まずこれらのセクションに目を通 してください。

私たち自身の Django ブログアプリを構築する

さて、必要な知識が揃ったので、今日から最初の Django ブログアプリの構築に取りかかりましょう。

1. Django プロジェクトとアプリの作成

最初のステップは、アプリケーションのために新しい Django プロジェクトをセットアップすることです。

したがって、ターミナルで実行します。

django-admin startproject <project_name>

そして、そのプロジェクトの中に入り、以下の行を実行して Django アプリを作成します。

django-admin startapp blogapp

以上で、settings.py に Django アプリを登録しました。

from django.contrib import admin
from django.urls import path,include
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blogapp.urls')),
]

2. アプリの URL をプロジェクトの URL ファイルにインクルードする

アプリ内に新しい urls.py ファイルを作成し、プロジェクトの urls.py ファイルにリンクします。

したがって、project/urls.pyに、以下のコードを追加します。

from .models import BlogModel, CommentModel
admin.site.register(BlogModel)
admin.site.register(CommentModel)

また、admin.py ファイルにモデルを登録します。

admins.pyファイルに、以下のコードを追加します。

from django.db import models
class BlogModel(models.Model):
    id = models.IntegerField(primary_key=True)
    blog_title = models.CharField(max_length=20)
    blog = models.TextField()
 
    def __str__(self):
        return f"Blog: {self.blog_title}"
 
class CommentModel(models.Model):
    your_name = models.CharField(max_length=20)
    comment_text = models.TextField()
    blog = models.ForeignKey('BlogModel', on_delete=models.CASCADE)
     
    def __str__(self):
        return f"Comment by Name: {self.your_name}"

3. Django のモデルをコーディングする

BlogApp では、Blogs を保存するモデルと、各 Blog のコメントを保存するモデルが必要です。

したがって、 blogapp/models.py で、以下のフィールドを持つ BlogModel と CommentModel という二つのモデルを作成します。

from django import forms
class CommentForm(forms.Form):
    your_name =forms.CharField(max_length=20)
    comment_text =forms.CharField(widget=forms.Textarea)
 
    def __str__(self):
        return f"{self.comment_text} by {self.your_name}"
 
class SearchForm(forms.Form):
    title = forms.CharField(max_length=20)

CommentModelのblogフィールドはBlogModelとリンクしていることに注意してください。

4. Django フォームのコード化

また、2つのフォームが必要です。

  1. コメントを書き込むためのフォーム
  2. Blogs を検索するための検索フォーム

そこで、blogappにforms.pyファイルを作成し、以下のコードを追加します。

from .models import BlogModel,CommentModel
from .forms import SearchForm,CommentForm
from django.shortcuts import render,redirect
 
def BlogListView(request):
    dataset = BlogModel.objects.all()
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data['title']
            blog = BlogModel.objects.get(blog_title=title)
            return redirect(f'/blog/{blog.id}')
    else:
        form = SearchForm()
        context = {
            'dataset':dataset,
            'form':form,
        }
    return render(request,'blogapp/listview.html',context)
 
 
def BlogDetailView(request,_id):
    try:
        data =BlogModel.objects.get(id =_id)
        comments = CommentModel.objects.filter(blog = data)
    except BlogModel.DoesNotExist:
        raise Http404('Data does not exist')
     
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            Comment = CommentModel(your_name= form.cleaned_data['your_name'],
            comment_text=form.cleaned_data['comment_text'],
            blog=data)
            Comment.save()
            return redirect(f'/blog/{_id}')
    else:
        form = CommentForm()
 
    context = {
            'data':data,
            'form':form,
            'comments':comments,
        }
    return render(request,'blogapp/detailview.html',context)

5. Django のビューをコーディングする

ここでも 2 つの Views が必要です。

  1. リストビュー。ブログのリストと検索フォームを表示します。
  2. 詳細ビュー。個々のBlog、CommentForm、過去に投稿されたコメントを表示します。

というわけで、以下の List View と Detail View を blogapp/views.py に追加します。

path('blogs/', BlogListView, name='blogs'),
path('blog/<int:_id>', BlogDetailView, name='blog'),

ビューのURLパスは以下のようになります。

<form method="post">
    {%csrf_token %}
    <H2> Search Blog Here</H2>
    {{form.as_p}}
    <input type ="submit" value="Search">
</form>
 
{% for data in dataset %}
<h3>{{data.blog_title}}</h3>
<a href = "{% url 'blog' _id=data.id %}">Read More</a>
<hr/>
{% endfor %}

上記のコードをblogapp/urls.pyに追加します。

6. Django テンプレートのコード化

コンテンツを表示するには、やはり 2 つのテンプレートが必要で、1 つはそれぞれの View 用です。

  1. App 内に templates フォルダを作成します。
    1. templates フォルダに、blogapp という名前のフォルダを作成します。

ここで、templates/blogappフォルダの中に、以下の2つのlistview.htmlとdetailview.htmlファイルを追加してください。

1.listview.htmlファイル

<h3>Title:</h3><p>{{data.blog_title}}</p><br>
<h3>Blog</h3>
<p>{{data.blog}}</p>
<hr/>
 
<a href = "{% url 'blogs' %}">Go Back</a>
 
 
<form method="post">
    {%csrf_token %}
    <H2> Comment Here</H2>
    {{form.as_p}}
    <input type ="submit" value="Comment">
</form>
 
{%for comment in comments%}
<p><strong>{{comment.your_name}}:</strong> {{comment.comment_text}}</p>
{%endfor %}

2.detailview.htmlファイル

from django.db import models
class BlogModel(models.Model):
    id = models.IntegerField(primary_key=True)
    blog_title = models.CharField(max_length=20)
    blog = models.TextField()
 
    def __str__(self):
        return f"Blog: {self.blog_title}"
 
class CommentModel(models.Model):
    your_name = models.CharField(max_length=20)
    comment_text = models.TextField()
    blog = models.ForeignKey('BlogModel', on_delete=models.CASCADE)
     
    def __str__(self):
        return f"Comment by Name: {self.your_name}"

これで完了です。

ブログアプリに必要なものはこれだけです。

プロジェクトの最終コード

すべてのファイルを組み合わせた最終的なコードは以下の通りです。

  1. models.py
from django import forms
 
class CommentForm(forms.Form):
    your_name =forms.CharField(max_length=20)
    comment_text =forms.CharField(widget=forms.Textarea)
 
    def __str__(self):
        return f"{self.comment_text} by {self.your_name}"
 
 
 
class SearchForm(forms.Form):
    title = forms.CharField(max_length=20)
  1. フォーム.py
from .models import BlogModel,CommentModel
from .forms import SearchForm,CommentForm
from django.shortcuts import render,redirect
 
def BlogListView(request):
    dataset = BlogModel.objects.all()
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data['title']
            blog = BlogModel.objects.get(blog_title=title)
            return redirect(f'/blog/{blog.id}')
    else:
        form = SearchForm()
        context = {
            'dataset':dataset,
            'form':form,
        }
    return render(request,'blogapp/listview.html',context)
 
 
def BlogDetailView(request,_id):
    try:
        data =BlogModel.objects.get(id =_id)
        comments = CommentModel.objects.filter(blog = data)
    except BlogModel.DoesNotExist:
        raise Http404('Data does not exist')
     
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            Comment = CommentModel(your_name= form.cleaned_data['your_name'],
            comment_text=form.cleaned_data['comment_text'],
            blog=data)
            Comment.save()
            return redirect(f'/blog/{_id}')
    else:
        form = CommentForm()
 
    context = {
            'data':data,
            'form':form,
            'comments':comments,
        }
    return render(request,'blogapp/detailview.html',context)
  1. views.py
<html>
<body>
<form method="post">
    {%csrf_token %}
    <H2> Search Blog Here</H2>
    {{form.as_p}}
    <input type ="submit" value="Search">
</form>
 
{% for data in dataset %}
<h3>{{data.blog_title}}</h3>
<a href = "{% url 'blog' _id=data.id %}">Read More</a>
<hr/>
{% endfor %}
</html>
</body>

4.リストビュー.html

<html>
<body>
<h3>Title:</h3><p>{{data.blog_title}}</p><br>
<h3>Blog</h3>
<p>{{data.blog}}</p>
<hr/>
 
<a href = "{% url 'blogs' %}">Go Back</a>
 
 
<form method="post">
    {%csrf_token %}
    <H2> Comment Here</H2>
    {{form.as_p}}
    <input type ="submit" value="Comment">
</form>
 
{%for comment in comments%}
<p><strong>{{comment.your_name}}:</strong> {{comment.comment_text}}</p>
{%endfor %}
</html>
</body>

4.リストビュー.html

from django.contrib import admin
from django.urls import path
from .views import *
 
urlpatterns = [
    path('blogs/', BlogListView, name='blogs'),
    path('blog/<int:_id>', BlogDetailView, name='blog'),
]
  1. blogapp/urls.py
python manage.py migrate
python manage.py makemigrations
python manage.py migrate

プロジェクトの実施

それでは、コードを実装してみましょう。

最初に、DBモデルのテーブルを作成するためにマイグレーションを適用する必要があります。

したがって、以下のコードをシェルで実行してください。

python manage.py runserver

次に、ターミナルを使用してサーバーを実行します。

INSTALLED_APPS
INSTALLED_APPS

管理サイト(“/admin”)からいくつかのBlogを追加してください。

Blog Admin
Blog Admin

エンドポイント”/blogs “に移動します。

Blogs
Blogs

任意のブログにアクセスし、Django Hello World と言ってみてください。

Blog 1
Blog 1

コメントを追加して、送信を押すと、コメントが下に表示されます。

Blog 1 With Comment
Blog 1 With Comment

他のブログ、例えば Django Views のブログに行くと、上のコメントは Django Hello World ブログだけのものなので、表示されないことに注意してください。

Blog 2
Blog 2

まとめ

以上、Django Blog アプリケーションについてでした。

ユーザ認証のような追加機能を持つ独自の Blog アプリ を作ってみてください。

Django User Authentication の記事をチェックしてみてください。

次回は、このプロジェクトを VPS (Virtual Private Server) にデプロイしてみようと思います。

タイトルとURLをコピーしました