読者です 読者をやめる 読者になる 読者になる

牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

ジャンゴと奏でる 〜数時間でおぼえるDjango〜「03簡単なブログを作る その2」

Django

ジャンゴと奏でる 〜数時間でおぼえるDjango〜「もくじ」


[訂正]ファイル名訂正。誤「ulr.py」-> 正「ulrs.py」

entriesにもulr.py

/hoge/jam/urls.pyを次のように書き換えます。

from django.conf.urls.defaults import *

urlpatterns = patterns('',
                       (r'^entries/', include('entries.urls')),
                       )

/hoge/jam/entries/の中に新しくファイル『urls.py』を作成して次の内容を書きます。*1

from django.conf.urls.defaults import *
from entries.models import Entry

info_dict = {
    'queryset':Entry.objects.all(),
    }

urlpatterns = patterns('',
                       (r'^$',
                        'django.views.generic.list_detail.object_list',
                        info_dict),
                       )

『urls.py』は同じ名前のファイルなので、置き場所に気をつけてください。

テンプレート作成

ブログのエントリーを一覧表示するためのテンプレート(html)を新しく作成します。

/hoge/jam/entries/に「templates」ディレクトリを新しく作り、その中にまた「entries」を作ります。そこに新しくファイルentry_list.htmlを作成して次を書き込んでください。
(detailは詳細、updateは編集、deleteは削除へのリンクです。後述します。)

<h3>一覧</h3>

{% for entry in object_list %}

<dt>
<a href="/entries/detail/{{ entry.id }}">{{ entry.title }}</a>
</dt>

<dd>
  {{ entry.content }}
</dd><br />

<dd class="operation">
  <a href="/entries/update/{{ entry.id }}">編集</a>
  <a href="/entries/delete/{{ entry.id }}">削除</a>
</dd>
<hr />

{% endfor %}
Webブラウザで確認

確認用Webサーバを立ち上げてブラウザで確認してみましょう。
アドレスはhttp://127.0.0.1:8000/entries/です。


ひとつも記事がないので真っ白な画面になってしまいました。

記事を追加できるように

/hoge/jam/entries/urls.pyに次の部分をを追加修正します。 (r'^create/$', 〜 /entries/'}),

urlpatterns = patterns('',
                       (r'^$',
                        'django.views.generic.list_detail.object_list',
                        info_dict),
                       (r'^create/$',
                        'django.views.generic.create_update.create_object',
                        {'model':Entry, 'post_save_redirect':'/entries/'}),
                       )

それから、テンプレートjam/entries/templates/entries/entry_form.htmlを新しく作成します。

  <h3>新規作成</h3><br/>

  {% if form.has_errors %}
    {% for field in form.fields %}

      {% if field.error %}
        {{ field.error }}
      {% endif %}

    {% endfor %}
  {% endif %}

<div class="validation">
  <form action="." method="post" accept-charset="utf-8">
    <label for="id_title">タイトル</label>{{ form.title }}
    {% if form.title.errors %} <p><error> {{ form.title.errors|join:", "}}</error></p>{% endif %}<br/><br/>
    <label for="id_content">内容</label>{{ form.content }}
    {% if form.content.errors %} <p><error>  {{ form.content.errors|join:", "}}</error></p><br/><br/>{% endif %}
    <p><input type="submit" value="保存" /></p><br/>
  </form>
</div>


<div class="operation">
  <a href="/entries/">一覧に戻る</a>
</div>
Webブラウザで確認

http://127.0.0.1:8000/entries/create/にアクセスして確認してみてください。


バリデーション

何も入力しないで『保存』ボタンを押すと


「このフィールドは必須です。」と日本語表示で指摘してくれます。

記事を追加してみる

何個か記事を追加してみてください。追加したものが一覧に表示されるようになります。
(一覧表示はhttp://127.0.0.1:8000/entries/


詳細表示

タイトルをクリックで詳細を表示させます。
/hoge/jam/entries/urls.pyに次の部分を追加修正してください。(r'^detail/ 〜 info_dict),

urlpatterns = patterns('',
                       (r'^$',
                        'django.views.generic.list_detail.object_list',
                        info_dict),
                       (r'^create/$',
                        'django.views.generic.create_update.create_object',
                        {'model':Entry, 'post_save_redirect':'/entries/'}),
                       (r'^detail/(?P<object_id>\d+)/$',
                        'django.views.generic.list_detail.object_detail',
                        info_dict),
                       )

/hoge/jam/entries/templates/entries/entry_detail.htmlを新しく作成。

<dt>
  {{ object.title }}
</dt>

<dd>
  {{ object.content}}
</dd><br />

<dd div class="operation">
  <a href="/entries/update/{{ object.id }}">編集</a>
  <a href="/entries/delete/{{ object.id }}">削除</a>
</dd><br />

<dd div class="operation">
  <a href="/entries/">一覧に戻る</a>
</dd>
Webブラウザで確認

http://127.0.0.1:8000/entries/create/の一覧からタイトルをクリックすると詳細表示。


ちなみに、まだ作ってない処理のボタンを押すと


エラー画面になります(´・ω・`)『編集』とか。

編集できるように

追加したエントリーを修正したい時に、編集できるようにします。
/hoge/jam/entries/urls.pyに次の部分を追加修正してください。 (r'^update/ 〜 {'model':Entry}),

urlpatterns = patterns('',
                       (r'^$',
                        'django.views.generic.list_detail.object_list',
                        info_dict),
                       (r'^create/$',
                        'django.views.generic.create_update.create_object',
                        {'model':Entry, 'post_save_redirect':'/entries/'}),
                       (r'^detail/(?P<object_id>\d+)/$',
                        'django.views.generic.list_detail.object_detail',
                        info_dict),
                       (r'^update/(?P<object_id>\d+)/$',
                        'django.views.generic.create_update.update_object',
                        {'model':Entry}),
                       )
新規作成画面を流用

新規作成画面のテンプレートを流用するので
/hoge/jam/entries/templates/entries/entry_form.htmlの

<h3>新規作成</h3><br/>

の部分を以下に書き換えてください。

  {% if object %}
  <h3>編集</h3><br/>
  {% else %}
  <h3>新規作成</h3><br/>
  {% endif %}

これで編集できるようになりました。

Webブラウザで確認

http://127.0.0.1:8000/entries/から記事の下にある「編集」をクリックして内容を変えてみましょう。


保存すると詳細表示になります。


削除機能を追加

/hoge/jam/entries/urls.pyに次の部分を追加修正してください。 (r'^delete/ 〜 /entries/'}),

urlpatterns = patterns('',
                       (r'^$',
                        'django.views.generic.list_detail.object_list',
                        info_dict),
                       (r'^create/$',
                        'django.views.generic.create_update.create_object',
                        {'model':Entry, 'post_save_redirect':'/entries/'}),
                       (r'^detail/(?P<object_id>\d+)/$',
                        'django.views.generic.list_detail.object_detail',
                        info_dict),
                       (r'^update/(?P<object_id>\d+)/$',
                        'django.views.generic.create_update.update_object',
                        {'model':Entry}),
                       (r'^delete/(?P<object_id>\d+)/$',
                        'django.views.generic.create_update.delete_object',
                        {'model':Entry,'post_delete_redirect':'/entries/'}),
                       )

削除用テンプレート作成
/hoge/jam/entries/templates/entries/entry_confirm_delete.htmlを新しく作成。
entry_confirm_delete.html

<form method="post" action=".">
<p>削除します。よろしいですか?</p><br />
 
<input type="submit" />
<input type="button" value="いいえ" onClick="location.href='/entries/'" />
</form><br />

<div class="operation">
  <a href="/entries/">一覧に戻る</a>
</div>
Webブラウザで確認

http://127.0.0.1:8000/entries/から記事の下にある「削除」をクリックして確認してみましょう。


ここで「実行」ボタンを押すと削除されます。


これで基本的な一通りの機能が出来上がりました。

*1:DjangoはMTVフレームワーク、Model:モデル、Template:テンプレート、View:ビューですが、このチュートリアルではコードをなるべく少なく作れるようModelとTemplateだけを使うようにしました。だからview.pyには何も書いていません。かわりにgeneric view:汎用ビュー を使用しています(urls.pyに書いたdjango.views.generic...)。詳しくはDjango公式ドキュメントを参照してください。