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

モデルの__str__メソッド

アドミン画面でPostモデルのレコードを見るとPost objectとなっていますね。これだとちょっとわかりづらいので、もっとわかりやすいものに変更しましょう。
post_object

forum/models.pyを開いて、__str__というメソッドを追加しましょう。


class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    date_created = models.DateTimeField(auto_now_add=True)
    is_published = models.BooleanField(default=True)

    # これを追加
    def __str__(self):
        return u'{}'.format(self.title) # オブジェクトのtitleの部分を表示するように設定

http://127.0.0.1:8000/admin/forum/post/をリロードすると各オブジェクトのtitleが表示されるようになっています。__str__で返す値は自由に設定できます。(興味がある方はPythonの文字列フォーマットを調べてみてください)

ListView

オブジェクトをいくつか追加していくと今度はアドミン画面だけではなく、アプリ側でも作ったオブジェクトを見たくなりますよね。Postモデルのオブジェクトの一覧を表示するためのロジックを追加しましょう。Djangoでデータベースの特定のモデルのオブジェクトの一覧を表示するためにはListViewというClass Based Viewを使います。

forum/views.py

# 以下の行にListViewを追加
from django.views.generic import CreateView, ListView

# PostListのクラスを新しく追加
class PostList(ListView):
    model = Post

 

forum/urls.pyを開いて、PostListのURLを追加

urlpatterns = [
    url(r'post/create/$', views.PostCreate.as_view(), name='post_create'),
    url(r'^$', views.PostList.as_view(), name='post_list'),  # これを追加
]

forum/templates/forum/post_list.htmlというテンプレートを作成して、以下のコードを追加。

 

object_listの変数にデータベースにあるすべてのPostオブジェクトが格納されているので、forループを使って、一つずつ読み込みます。forループ内ではオブジェクトをpost変数からアクセスできます。postオブジェクトにはmodels.pyのPostクラスで定義されているデータベースカラム(date_created、title、body )をオブジェクトのattributeからアクセスできます。

 

Djangoの{% empty %}テンプレートタグを使うことによって、データベースにオブジェクトが入っていなかった場合のメッセージを簡単に設定できます。

{% for post in object_list %}
    <div>
        <div><small>{{ post.date_created }}</small></div>
        <div>{{ post.title }}</div>
        <div>{{ post.body }}</div>
    </div>
{% empty %}
    <div>投稿がまだありません</div>
{% endfor %}

127.0.0.1:8000/forumを開いて、Postの一覧が表示されているのを確認しましょう。

ここでまたgitのコミットを作成してoriginにプッシュすると良いでしょう。

git add .
git commit -m "added post listview"
git push origin master