ジャンゴと奏でる 〜数時間でおぼえるDjango〜「もくじ」
ユーザ認証
管理画面からでは無く、ログインした人のみ記事の追加・編集・削除などできるように変更します。
ログイン・ログアウト処理
ログイン・ログアウトのアドレスとテンプレート場所を指定します。
/jam/entries/urls.py の最後にコードを追加します。
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), (r'^detail/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict), (r'^create/$', 'django.views.generic.create_update.create_object', {'model':Entry, 'post_save_redirect':'/entries/'}), (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/'}), ) urlpatterns += patterns('', (r'^login/$', 'django.contrib.auth.views.login', {'template_name':'entries/registration/login.html'}), (r'^logout/$', 'django.contrib.auth.views.logout', {'template_name':'entries/registration/logout.html'}), )
settings.py
ログインページと、リダイレクト先を設定します。
settings.pyの最後尾あたりに下記を追加して下さい。
LOGIN_REDIRECT_URL = "/entries/" LOGIN_URL = "/entries/login/"
settings.pyを変更したときは
必ず
python manage.py syncdb
のコマンドを実行するようにしてください。
ログイン・ログアウト用テンプレート
jam/entries/templates/entries/registration/ ディレクトリを作成。
そこに次の2つファイルを新しく作成してください。
login.htm
/jam/entries/templates/entries/registration/login.html
{% extends "base.html" %} {% block main %} <div class="validation"> <p><error> {% if form.errors %} 正しいユーザ名とパスワードを入力してください (大文字小文字は区別します) 。 {% endif %} </error></p> <br /> <form method="post" action="."> <label for="username">ユーザ名:</label> {{ form.username }} <br /> <label for="password">パスワード:</label> {{ form.password }} <br /> <input type="submit" value="ログイン" /> </form> </div> <br /> <br /> <dd div class="operation"> <a href="/entries/">一覧に戻る</a> </dd> {% endblock %}
logout.html
/jam/entries/templates/entries/registration/logout.html
{% extends "base.html" %} {% block main %} <p>ログアウトしました</p> <br /> <div class="operation"> <p><a href="../login/">もう一度ログイン</a></p> </div> <br /> <br /> <dd div class="operation"> <a href="/entries/">一覧に戻る</a> </dd> {% endblock %}
Webブラウザで確認
ログアウト
次のアドレスに行くとログアウトします。(後ほどリンクを追加します。)
http://127.0.0.1:8000/entries/logout/
ログイン時のみ「記事の追加」を表示する
/jam/entries/templates/entries/ディレクトリにあるテンプレートを修正していきます。
一覧画面
/jam/entries/templates/entries/base_entries.html
{% extends "base.html" %} {% block main %} {% if user.is_anonymous %} <dd div class="operation"> <a href="/entries/login/">ログインする</a> </dd> <hr /> {% else %} <p>username: <b>{{ user.username }}</b> <a href="/entries/logout/"> [ログアウト]</a> </p> <dd div class="operation"> <a href="/entries/create/">記事の追加</a> </dd> <hr /> {% endif %} {% block entry_content %} {% endblock entry_content %} {% endblock main %}
Webブラウザで確認
ログアウトしてからhttp://127.0.0.1:8000/entries/にアクセスしてください。
「記事の追加」が無くなり、「ログインする」に変更されました。
「編集」「削除」も
/jam/entries/templates/entries/entry_list.html
{% extends "entries/base_entries.html" %} {% block entry_content %} {% for entry in object_list %} <dt> <a href="/entries/detail/{{ entry.id }}">{{ entry.title }}</a> </dt> <dd> {{ entry.content }} </dd> <br /> {% if not user.is_anonymous %} <dd class="operation"> <a href="/entries/update/{{ entry.id }}">編集</a> <a href="/entries/delete/{{ entry.id }}">削除</a> </dd> {% endif %} <hr /> {% endfor %} {% endblock %}
Webブラウザで確認
詳細画面
/jam/entries/templates/entries/entry_detail.html
{% extends "entries/base_entries.html" %} {% block entry_content %} <dt> {{ object.title }} </dt> <dd> {{ object.content}} </dd> <br /> {% if not user.is_anonymous %} <dd div class="operation"> <a href="/entries/update/{{ object.id }}">編集</a> <a href="/entries/delete/{{ object.id }}">削除</a> </dd> <br /> {% endif %} <dd div class="operation"> <a href="/entries/">一覧に戻る</a> </dd> {% endblock %}
Webブラウザで確認
http://127.0.0.1:8000/entries/
一覧でタイトルをクリックで詳細。
新規作成・削除画面も修正
直接アクセスしても表示されないように修正。
新規作成画面
/jam/entries/templates/entries/entry_form.html
{% extends "entries/base_entries.html" %} {% block entry_content %} {% if not user.is_anonymous %} {% if object %} <h3>編集</h3><br/> {% else %} <h3>新規作成</h3><br/> {% endif %} {% 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> {% endif %} <div class="operation"> <a href="/entries/">一覧に戻る</a> </div> {% endblock %}
Webブラウザで確認
削除画面
/jam/entries/templates/entries/entry_confirm_delete.html
{% extends "entries/base_entries.html" %} {% block entry_content %} {% if not user.is_anonymous %} <form method="post" action="."> <p>削除します。よろしいですか?</p> <br /> <input type="submit" /> <input type="button" value="いいえ" onClick="location.href='/entries/'" /> </form> <br /> {% endif %} <div class="operation"> <a href="/entries/">一覧に戻る</a> </div> {% endblock %}
新規ユーザを作成してログインしてみる
管理サイトにログインして、新規ユーザを作成してください。
http://127.0.0.1:8000/admin/
『Auth』の中の「ユーザ」右にある「追加」をクリック。
作成したユーザでログイン
http://127.0.0.1:8000/entries/
ログインできました。(「記事の追加」の上の『username:xxxs [ログアウト]』からログアウトできます。)
各ページを一通り確認してみてくださいね。
おわり
Djangoに触れてみてどうでしたか?
私のような初心者でもこの程度のことならDjangoがあればできます。ブログとしてまだまだ未完成ですけどね。
Djangoはなかなかいいやつだから使ってみてください。
今の自分にはこれが精一杯。もっと突っ込んだことがしたくなったら公式ドキュメント(和訳)を読んでみて。有意義な情報がたくさんあると思うから。
これにて、ひとまず終了です。お疲れさまでした(・∀・)
次回予告
このチュートリアルは、これでしばらく中断します。気がむいたら、もしくは要望があれば続くかもしれません。以下、やりたいことリストです。
- 画像のアップロード
- ライトボックス系JSライブラリの使用
- 国際化
- 携帯サイト対応
- そのほかいろいろ
お礼
このチュートリアルを作成するにあたって色々なサイトを参考にさせていただきました。
この場を借りてお礼申し上げます。ありがとうございました(・∀・)
- The Web framework for perfectionists with deadlines | Django(本家です)
- http://djangoproject.jp/doc-jp/(訳者の方々には頭が上がりません)
- ueBLOG | Django再入門 RandomNoteを作る vol.2 汎用ビュー(Genericview)(汎用ビューたいへん参考になりました)
- http://railsofrubyonrails.com/(この書籍からいろいろヒントをいただきました。Rails本ですが)
- 常山日記(Djangoの情報はいつもここから)
- そのほかのDjango・Pythonを扱ってるサイトの方々