今回は、DjangoのBlogアプリを作成します。
初心者のために、Django で独自のブログアプリケーションを作る前に、ブログとは何かという簡単な基本を確認しましょう。
この記事もチェック:Django CRUDアプリケーション
ブログってなんだろう?
ブログサイトは、あらゆる情報を個別かつ有益なテキスト形式のエントリ(投稿)で公開するオンラインプラットフォームです。
さらに、人々は各ブログのコメント欄でクエリを共有し、意見を交換することができます。
ブログアプリケーションは、 Django フレームワークを実践するための優れた方法です。
これから、閲覧者が利用できるブログアプリケーションを作成します。
- 全てのブログのリストを見る
- 各ブログの投稿を見る
- 各ブログの記事に存在するコメント欄にコメントします。
- 特定のブログ記事を検索する
Django ブログを構築するための前提条件
このアプリケーションでは、以下の知識が必要です。
- Django のモデル
- Django のビュー
- Django の URL
- Django テンプレート
- Django フォーム
もし、これらのセクションに馴染めないと感じたら、まずこれらのセクションに目を通 してください。
この記事もチェック:Django URL テンプレート
私たち自身の 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')),
] |
この記事もチェック:Python Djangoのアプリ構成とプロジェクト構成を分かりやすく解説
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つのフォームが必要です。
- コメントを書き込むためのフォーム
- 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 が必要です。
- リストビュー。ブログのリストと検索フォームを表示します。
- 詳細ビュー。個々の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に追加します。
この記事もチェック:DjangoのListViewの使い方を解説していく
6. Django テンプレートのコード化
コンテンツを表示するには、やはり 2 つのテンプレートが必要で、1 つはそれぞれの View 用です。
- App 内に templates フォルダを作成します。
-
- 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}"
|
これで完了です。
ブログアプリに必要なものはこれだけです。
プロジェクトの最終コード
すべてのファイルを組み合わせた最終的なコードは以下の通りです。
- 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 )
|
- フォーム.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)
|
- 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' ),
] |
- blogapp/urls.py
python manage.py migrate python manage.py makemigrations python manage.py migrate |
プロジェクトの実施
それでは、コードを実装してみましょう。
最初に、DBモデルのテーブルを作成するためにマイグレーションを適用する必要があります。
したがって、以下のコードをシェルで実行してください。
python manage.py runserver |
次に、ターミナルを使用してサーバーを実行します。

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

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

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

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

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

まとめ
以上、Django Blog アプリケーションについてでした。
ユーザ認証のような追加機能を持つ独自の Blog アプリ を作ってみてください。
Django User Authentication の記事をチェックしてみてください。
次回は、このプロジェクトを VPS (Virtual Private Server) にデプロイしてみようと思います。
この記事もチェック:Heroku、Githubを通してDjangoアプリをデプロイする方法を解説する