はじめての Django アプリ作成、その 3 (1)
多分その 2 は最後らへんをもう少しきちんとヤります。
次のその 3は view に焦点を当てて、との事。URLconf 云々な記述あり。rails で言やあ routes.rb (だったっけ??) か。
ってドキュメント見てると微妙に差別的な表現がナニされている。例えば
また、 .php のようなくだらない文字列を URL に追加する必要もありません。ただし、病的なユーモアの持ち主のために、以下のようにすれば実現できることは示しておきましょう
と書きつつ
とはいえ、こんな阿呆なことはやめましょう。
って ...
続ける
微妙な指摘はスルーで mysite/urls.py を修正。てーかテキトーにヤッツケちゃってますが、そろそろいい加減きちんと正規表現の勉強した方がいいなぁ (何
とりあえず mysite/urls.py には例示されているナニを追加。次は view を作るとの事。まず mysite/polls/views.py を開いて
from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the poll index.")
をナニ。これで http://localhost:8000/polls/ にアクセスすると HttpResponse な引数の文字列がブラウザに出力。あるいは以下だと URL に指定した ID がナニ
# Create your views here. from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the poll index.") def detail(request, poll_id): return HttpResponse("You're looking at poll %s." % poll_id)
こうして http://localhost:8000/polls/23 とかにアクセスしてみると
You're looking at poll 23.
と出力。なかなかヤるな。次はそろそろ_実際に動く_なのかな。そろそろテンプレートとかも出てくる模様。
で、ドキュメントをニラんでたのですが
from mysite.polls.models import Poll from django.http import HttpResponse def index(request): latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] output = ', '.join([p.question for p in latest_poll_list]) return HttpResponse(output)
の何がデザインなのか分からん (わら
とりあえずこのあたりの細かい部分はスルーで写経だ。ええとまず index な view を以下に修正
def index(request): latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] t = loader.get_template('polls/index.html') c = Context({ 'latest_poll_list': latest_poll_list, }) return HttpResponse(t.render(c))
で、mysite/polls/index.html を作るのかな
{% if latest_poll_list %} <ul> {% for poll in latest_poll_list %} <li>{{ poll.question }}</li> {% endfor %} </ul> {% else %} <p>No polls are available.</p> {% endif %}
で、http://localhost:8000/polls にアクセスしてみたんですが結果微妙。って index.html がドコにも無いし。しかも作る先は mysite/polls/index.html ってダウト。ドキュメント全然読んでねぇし。どうするか、というと
- settings.py の TEMPLATE_DIRS にエントリ追加
- TEMPLATE_DIRS なソレに polls 掘って index.html 投入。
でも NG。何故だ、と言いつつ views.py の import なソレが微妙である事が発覚。現時点で以下なカンジ。
from django.template import Context, loader from mysite.polls.models import Poll from django.http import HttpResponse def index(request): latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] t = loader.get_template('polls/index.html') c = Context({ 'latest_poll_list': latest_poll_list, }) return HttpResponse(t.render(c)) def detail(request, poll_id): return HttpResponse("You're looking at poll %s." % poll_id)
現時点ではこれで What's up? が出力されている状態なんですがこれでええんかな。時間はあるんですが電池が無くなるのがイタい。どっかにコンセント無いかなぁ。(を
shortcut
t = loader.get_template('polls/index.html') c = Context({ 'latest_poll_list': latest_poll_list, }) return HttpResponse(t.render(c))
なソレは使用頻度が高いパターンみたい。DRY なソレが用意されている、との事。
from django.shortcuts import render_to_response from mysite.polls.models import Poll from django.http import HttpResponse def index(request): latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list}) def detail(request, poll_id): return HttpResponse("You're looking at poll %s." % poll_id)
出力は当たり前ですが同一。次は detail なソレ。以下なカンジにして
from django.shortcuts import render_to_response from mysite.polls.models import Poll from django.http import HttpResponse from django.http import Http404 def index(request): latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list}) def detail(request, poll_id): try: p = Poll.objects.get(pk=poll_id) except Poll.DoesNotExist: raise Http404 return render_to_response('polls/detail.html', {'poll': p})
http://localhost:8000/polls/1 とかにアクセスしてみたらテンプレが無い、と叱られる。先に作っちゃえ。
<h1>{{ poll.question }}</h1> <ul> {% for choice in poll.choice_set.all %} <li>{{ choice.choice }}</li> {% endfor %} </ul>
これをテンプレなディレクトリの中の polls ディレクトリの中に polls/detail.html という名前で保存。一応アクセス確認。
で、get して無ければ 404 というのもよくあるパターンらしく、ショートカットがある模様。盛り込んでみたのが以下。
from django.shortcuts import render_to_response from django.shortcuts import render_to_response, get_object_or_404 from mysite.polls.models import Poll # from django.http import HttpResponse # from django.http import Http404 def index(request): latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list}) def detail(request, poll_id): p = get_object_or_404(Poll, pk=poll_id) return render_to_response('polls/detail.html', {'poll': p})
ふむふむ。DRY って本当大切だよな、な今日この頃なんで、これ式のソレは本当に良いなぁ、と感じます。
とりあえず電池が少なくなってきたので電源を探しにいこう (何
次はおそらくその 4 に着手すると思います。