ジャンゴと奏でる 〜数時間でおぼえる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 %}
バリデーション
何も入力しないか、間違ったユーザ名・パスワードでバリデーションチェックします。
管理画面に入る時と同じ様にログインしてみてください。
ログイン時のみ「記事の追加」を表示する
/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 %}
「編集」「削除」も
/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 %}
詳細画面
/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 %}
新規作成・削除画面も修正
直接アクセスしても表示されないように修正。
新規作成画面
/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 %}
削除画面
/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 %}
おわり
Djangoに触れてみてどうでしたか?
私のような初心者でもこの程度のことならDjangoがあればできます。ブログとしてまだまだ未完成ですけどね。
Djangoはなかなかいいやつだから使ってみてください。
今の自分にはこれが精一杯。もっと突っ込んだことがしたくなったら公式ドキュメント(和訳)を読んでみて。有意義な情報がたくさんあると思うから。
これにて、ひとまず終了です。お疲れさまでした(・∀・)
次回予告
このチュートリアルは、これでしばらく中断します。気がむいたら、もしくは要望があれば続くかもしれません。以下、やりたいことリストです。
- 画像のアップロード
- ライトボックス系JSライブラリの使用
- 国際化
- 携帯サイト対応
- そのほかいろいろ
お礼
このチュートリアルを作成するにあたって色々なサイトを参考にさせていただきました。
この場を借りてお礼申し上げます。ありがとうございました(・∀・)