Djangoでサイトを作ってみる – Class based views CreateView

DjangoのClass based views

DjangoにはいくつかのClass based viewsが用意されています。これらの汎用ビューを利用することによって、ウェブアプリケーションでよく使用されるデータベース関連のアクション、フォーム、その他ページを多くのコードを一から書くことがなく実装できます。とても便利なのでぜひフル活用しましょう。

CreateView

まずは先ほど生成した、Postテーブルにレコードを作成できる機能を組みましょう。forum/views.pyを開いて以下を追加します。


from django.views.generic import CreateView  # DjangoのCreateViewをインポート
from django.core.urlresolvers import reverse_lazy
from forum.models import Post  # 先ほど作成したデータベースモデルのPostをインポート


class PostCreate(CreateView):  # CreateViewを基に新しいクラスを定義。基底クラスに定義されている機能をすべて継承
    model = Post  # 使用するモデルを定義
    fields = ['title', 'body']  # フォームで編集可能にするモデルフィールド

    def get_success_url(self):
        return reverse_lazy('post_create')  # フォームを投稿後の飛び先を指定

forum/urls.pyという新しいファイルを作成し、以下のコードを追加。


from django.conf.urls import url
from forum import views  # 先ほど作成したビューをインポート。(正確にはviews.pyファイル内のすべてのものをインポート)


# URLパターンのリストに新しいURLを追加
urlpatterns = [
    url(r'post/create/$', views.PostCreate.as_view(), name='post_create'),
]

新しく作成したurlファイルを大本のurlファイルに追加します。djangotest/urls.pyに以下を追加。

from django.conf.urls import url, include  # includeを新しく追加
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^forum/', include('forum.urls')),  # forum.urlsに定義されているurlを追加
]

これで開発用サーバーが起動されているのを確認し(”python manage.py runserver”。virtualenvもアクティブ化している必要があります。)、ブラウザーで127.0.0.1:8000/forum/post/createを開いてみましょう。以下のエラーが表示されるはずです。テンプレートがないということですね。

TemplateDoesNotExist at /forum/post/create/
forum/post_form.html

では、テンプレートを作成しましょう。forumのフォルダ内にtemplatesというフォルダを作成し、その中にforumというフォルダを作成しましょう。forum/templates/forumというフォルダ構造になります。それで、forum/templates/forum内にエラーメッセージに書いてある通りにpost_form.htmlのというファイルを作成し、以下の内容を追加します。


<h1>
{% if object %}{% comment %}objectがある場合は既存のレコードの編集{% endcomment %}
    Edit
{% else %}{% comment %}objectがない場合はレコードの新規作成{% endcomment %}
    Add
{% endif %}
post
</h1>


<form method="post" action=".">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">
  Submit
</button>
</form>


もう一度ブラウザーで127.0.0.1:8000/forum/post/createを確認しましょう。今度は以下のようなフォームが表示されるはずです。

add_post_form

titleとbodyを入力して、フォームを送信しましょう。同じページがまた表示されるはずです。

Djangoのアドミン画面でレコードが作成されているか確認しましょう。アドミン画面にログインをするためにはsuperuserを作成する必要があります。

python manage.py createsuperuser

ユーザー名、メールアドレス、パスワードを入力すると新しいアカウントが作成されます。ブラウザーで127.0.0.1/adminを開いて新しく作成したユーザーの情報でログインをしましょう。アドミン画面を開いてもGroupsとUsersしか表示されませんので、以下の手順でPostsのモデルも追加します。

forum/admin.pyに以下を追加します。

from django.contrib import admin
from forum.models import Post


admin.site.register(Post)

127.0.0.1/adminをリロードすると、Postsが見れるようになっているはずです。先ほど投稿したpostがあるか確認しましょう。

admin_posts

ここまで書いたコードがなくなったら大変なので、ここで一度Gitにコミットをし、Bitbucketにプッシュをしましょう。

git status # 変更されたファイルを表示
git add . # すべてのファイルをステージングに追加
git commit -m "added post create view" # Gitメッセージはシンプルがベスト
git push origin master # origin (Bitbucket)にプッシュ。masterはbranch名。後ほど説明します