はじめての 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 に着手すると思います。