iPX社員によるブログ

iPX社員が"社の動向"から"自身の知見や趣味"、"セミナーなどのおすすめ情報"に至るまで幅広い話題を投下していくブログ。社の雰囲気を感じ取っていただけたら幸いです。

Djangoで簡単なブログを作ってみた

iPXのパルハットです。

前回は簡単にWebアプリケーションフレームワークであるDjangoについて簡単に紹介しました。今回はDjangoで実際に簡単なブログシステムを作ってみました。実現した機能がポストを格納するデータベースの作成、データペースから作成順にデータを取得して、ページに表示するなどです。環境設定については書かないことにしました。ブログは以下の環境で作りました。

  1. Python3.4
  2. Django1.8
  3. Sqlite3
  4. Bootstrap
  5. Eclipse

Eclipseにおいて、ファイル構造が以下の図で示します。f:id:ipx-writer:20150830151804p:plain
プロジェクトを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)

前回DjangoMVCに適用されていることに触りましたが、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を利用してもいいでしょう。

f:id:ipx-writer:20150830165618p:plain

まとめ

今回は簡単なブログを作ってみました。機能として、データベースからポストされたデータを取得して、htmlページに作成順に表示されることができました。また特定のページだけを表示することも可能になりました。課題としてユーザ認証、ポストの編集、削除、記事ランキング、推薦などの機能を追加することが考えられます。これらについて、次回の記事担当のときに書きたいです。