the dawn of yuriko hisory

アニメやら漫画関係で何か作りたいものと勉強したことのメモ用

DjangoGirlsに挑戦 ~アプリケーションを拡張しよう~

アプリケーションを拡張しよう

今回は個別の記事の表示
URLパターンをここで覚えておくとサイト作りに役立ちそう

リンクの作成

post_list.htmlにリンクをはっつけます。

% extends 'blog/base.html' %}

{% block content %}
  {% for post in posts %}
    <div class="post">
      <div class="date">
        書いた人:{{ post.author }}
      </div>
      <h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1> //1
      <p>{{ post.text|linebreaks }}</p>
    </div>
  {% endfor %}
{% endblock content %}

1. {% url 'post_detail' pk=post.pk %}
前半部分はpost_detailのリンクだとみてわかると思います。
pk=post.pkは変数の値を渡しています。
詳しくはURLとView側を見ていくとわかります。

とりあえず今の状態でアクセスしてもpost_detailがないので
エラーが起こってしまいます。
post_detailを作成します。

まずapp/ulrs.pyを修正します。

from django.conf.urls import include, url
from . import views

urlpatterns = [
    url(r'^$', views.post_list),
    url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'), //1
]

1.post/までは以前までで理解できます。
(?p[0-9]+)について
?pで変数宣言 pkを受け取ります。
post_list.htmlであったpk=post.pkの値がここに入るわけですね。
[0-9]+については正規表現がわかればある程度理解できると思います
0~9の数字のみで +が一けた以上を表しています。
つまりURLは (省略)/post/5 といった形になります。


URLのパターンができたので、次はView側を作成します。
views.pyに以下メソッドを記述します。

from django.shortcuts import render, get_object_or_404

def post_detail(request, pk): //1
    post = get_object_or_404(Post, pk=pk) //2
    return render(request, 'blog/post_detail.html',{
        'post': post
        })

1.pkは先ほどから出ている変数の値です

2. get_object_or_404はオブジェクトが存在しなかった場合404エラーを返すようにしています。
第一引数に取得するモデル、第二引数に検索する値を入れているので(Post, pk=pk)になっています。
ここでpkで検索していることに疑問を思うかもしれません。(どこかででてたかな?)
pkはDB作成時ににDjango側が自動的に主キーとなるカラムを追加してくれています。
pk=primary keyですね。
なのでそれを使って今まで検索していたのです。

さて、最後にテンプレートの作成をします。
これを作らないと画面表示できませんしね。
post_detail.htmlを作成します。

 extends 'blog/base.html' %}

{% block content %}
    <div class="post">
        {% if post.author %} //1
            <div class="date">
                {{ post.author }}
            </div>
        {% endif %}
        <h1>{{ post.title }}</h1>
        <p>{{ post.text|linebreaks }}</p>
    </div>
{% endblock %}

拡張テンプレートを忘れずに使用しましょう

1.{% if %} {% endif %}について特別説明の必要はない気がしますが
データがあれば出力して、空欄なら何もif文内の処理はおこないません。
意外とテンプレート側でもifを使うことが多いので慣れるとよさそうです。

以上で画面の表示も完璧になりました。
自称で入力フォームを作成してDjangogirlsは終了です。