Python > ブログ投稿ページの作成

ブログ投稿ページの作成

  1. フォームクラスの定義
  2. ビューの記述
  3. テンプレートの作成
  4. URLマッピング
  5. 動作確認

フォームクラスの定義

フォームの処理は django.forms.Form クラスにまとめられている。 そこでこのクラスを継承したクラスの定義をする。

class フォームクラス(django.forms.Form):

ここではブログ記事投稿フォームをEntryFormクラスと名づけて、mysite/blog/forms.py へ定義する。

from django import forms

class EntryForm( forms.Form ):
    title = forms.CharField(
        label = 'Title', 
        )

    body = forms.CharField(
        label = 'Body',
        widget = forms.Textarea(), 
        )

入力フォームの表示とデータの更新処理

  1. フォームオブジェクトの作成
  2. 入力が有効かのチェック(バリデーションチェック)
  3. データを更新して、別ページへリダイレクト。もしくはエラーの表示。
from django.http import HttpResponse, HttpResponseRedirect
from django.template import loader, RequestContext

def new( request ):
    # EntryFormインスタンスを生成
    from blog.forms import EntryForm
    if request.method == 'POST':
        form = EntryForm( request.POST )
    else :
        form = EntryForm()
        
    if form.is_valid():
        from blog.models import Entry
        new_entry = Entry()
        new_entry.title = form.cleaned_data[ 'title' ]

        new_entry.body = form.cleaned_data[ 'body' ]
        new_entry.save()

        return HttpResponseRedirect( '/blog/' )

    contexts = RequestContext( request, { 'form': form, } )
    template = loader.get_template( 'blog/new.html' )
    return HttpResponse( template.render( contexts ) )

テンプレートの作成

mysite/templates/blog/new.html へ作成する。

<html>
  <head>
<title>blogTest</title>
</head>
<body>
  <form action ="" method ="post">
  <table><tbody>
      {{form}}
      <tr><td cols = "2">
	  <input type = "submit" value = "SUBMIT" />
      </td></tr>
  </tbody></table>
  </form>
</body>
</html>

URLマッピング

mysite/urls.py に ( r'^blog/new/$', 'blog.views.new' ), を追記。

urlpatterns = patterns('',
    ...
    url(r'^admin/', include(admin.site.urls)),
                       ( r'^blog/new/$', 'blog.views.new' ),
)

動作確認

ブログ一覧ページの作成

  1. ビューの追加
  2. テンプレートの作成
  3. URLマッピング

ビューの追加

mysite/blog/views.py の追記。

def index( request ):
    from blog.models import Entry
    rows = Entry.objects.all().order_by( '-created_at' )

    contexts = RequestContext( request, {
            'rows':rows,
            })
    template = loader.get_template( 'blog/index.html' )
    return HttpResponse( template.render( contexts ) )
all()
すべてのEntryデータの抽出
order_by('created_at')
作成日時の降順ソート

テンプレートの作成

mysite/templates/blog/index.html にテンプレートを作成する。

<html>
  <head>
    <title>list</title>
  </head>
  <body>
    <h1>list</h1>
    {% for row in rows %}
    <div><h2>{{ row.title }}</h2></div>
    <div>Created at
      {{ row.created_at|date:"Y/m/d"}}</div>
    <div>{{row.body}}</div>
    {% endfor %}
  </body>
</html>
{% for row in rows %}
タグ機能。テンプレートへのロジック。
(パイプ) | フィルタ。テンプレート変数への簡単な加工。スペースは入れない。

URLマッピング

mysite/urls.py の編集。以下を urlpatternsに追記。

      ( r'^blog/$', 'blog.views.index' ),

以上で http://0.0.0.0:8000/blog/ へアクセスすると、今まで登録したブログ記事が 一覧で出力される。


参考文献

  • Python入門 2&3対応 (株式会社エスキュービズム,細田謙二,オレンジ岸本,石井光次郎,石川建彦,岡田正彦, 2010, 秀和システム)
最終更新:2011年10月28日 15:21