Djangoで簡単なブログを作ってみた
iPXのパルハットです。
前回は簡単にWebアプリケーションフレームワークであるDjangoについて簡単に紹介しました。今回はDjangoで実際に簡単なブログシステムを作ってみました。実現した機能がポストを格納するデータベースの作成、データペースから作成順にデータを取得して、ページに表示するなどです。環境設定については書かないことにしました。ブログは以下の環境で作りました。
- Python3.4
- Django1.8
- Sqlite3
- Bootstrap
- Eclipse
Eclipseにおいて、ファイル構造が以下の図で示します。
プロジェクトをBlogにして、myblogというアプリケーションを実装して行きます。myblogのsetting.pyの設定を自分の環境に適用させました。
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'bootstrapform', 'myblog', ) LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo' STATIC_URL = '/static/' STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), )
主に追加したものがmyblogとstaticファイルのパス設定です。時刻はアジアー系に設定しました。これらの設定が完了した後、システムの動作が確認できて、ローカルホストでページにIt Worksが表示されて、環境が出来上がりました。以降コードをメインに記事を書きます。
モデル(Model)
前回DjangoはMVCに適用されていることに触りましたが、Modelモジュールがそれのモデル部に当たります。主にデータベース関連の動作を担当します。今回はブログシステムなので、Modelモジュールに以下のクラスを作成しました。
from django.db import models class Athour(models.Model): name = models.CharField(max_length = 50) email = models.EmailField() def __str__(self): return self.name class Post(models.Model): title = models.CharField(max_length = 200) content = models.TextField() cdate = models.DateTimeField() athour = models.ForeignKey(Athour) def __str__(self): return self.title def get_athour(self): return self.athour.name
Athourクラスはポストを行ったユーザ関連のデータクラスで、Postはポスト関連データクラスです。
ビュー(View)
ビューは、HTTPリクエストを引数にとり、HTTPレスポンスを返すなど要求を処理するシステムです。
myblogのview.pyにindex関数とarticle関数を作成しました。index関数はポストされたブログオブジェクトを10個ごとにhtmlテンプレートに渡します。article関数はポストされた特定のオブジェクトをhtmlテンプレートに渡します。
from django.shortcuts import render, render_to_response, get_object_or_404from django.http import HttpResponse, HttpResponseRedirect from django.template import RequestContext from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from myblog.models import Post def index(request): posts = Post.objects.all().order_by('-cdate') paginator = Paginator(posts, 10) page = request.GET.get('page') try: contacts = paginator.page(page) except PageNotAnInteger: contacts = paginator.page(1) except EmptyPage: contacts = paginator.page(paginator.num_pages) return render_to_response('blog/index.html',{'contacts': contacts, 'posts':posts[:5]},context_instance = RequestContext(request)) def article(request, post_id = None): posts = Post.objects.all().order_by('-cdate') if post_id: post = get_object_or_404(Post, pk=post_id) return render_to_response('blog/article.html',{'posts':posts[:5], 'post':post}, context_instance = RequestContext(request))
コントローラ(Controller)
正規表現に基づくURLディスパッチャで、コンテンツをウェブに表示します。myblogの中にurls.pyを作成して、中の以下の正規表現分を追加しました。
from django.conf.urls import include, url, patterns from myblog import views urlpatterns = patterns('', url(r'^$',views.index, name = 'index'), url(r'^article/(?P<post_id>\d+)/$',views.article, name = 'article'), )
Blog内のurls.pyに
url(r'^blog/', include('myblog.urls', namespace='blog'))
を追加しました。これによって、ユーザが入力されたurlアドレスを正規表現によって識別することが可能になりました。
テンプレート(Template)
htmlテンプレートに関して、今回はBootstrapのブログテンプレートをベースにコードを作成しました。htmlファイルにつけまして、base.html, index.html, article.htmlの三つを作りました。実際のindexページが以下の図のようになりました。webページのスタイルは完全にBootstrapに従っています。自分でページのスタイルを設計する時間がない場合は、Bootstrapを利用してもいいでしょう。
まとめ
今回は簡単なブログを作ってみました。機能として、データベースからポストされたデータを取得して、htmlページに作成順に表示されることができました。また特定のページだけを表示することも可能になりました。課題としてユーザ認証、ポストの編集、削除、記事ランキング、推薦などの機能を追加することが考えられます。これらについて、次回の記事担当のときに書きたいです。