P36〜P45の例題を表示できるまで

P36〜P45には、request のパターンやテンプレートなど色々な事例が掲載されていますが、ページが表示されるまでの部分が記述されておらず、ページを表示させるには、前後の技を使って書いてやる必要があります。また、内容的に飛ばしてもいいのとちゃう? と思っていると そうでもないようです。その他ちょっとした応用を含めてサンプルを表示。

ファイル構成

どう置いたらよいと明記されていませんが、こんな感じでしょうか・・・
#ref(): ERROR: File not found: "Screenshot.png" at page "Python/Django完全解説/P36_P37_P38_P39_P40_P41_P42_P43_P44_P45"

hello_view.py

# -*- coding:utf-8 -*-
from django.http import HttpResponse

def hello(request):
   """Simply displays greeting message.
   """
   message="<html><body>こんにちはDjangoです。</body></html>"
   return HttpResponse(message)

#p36 プレーンテキストで時間を返す
def plaintext_time(request):
   """Hello with time """

   from time import ctime
   return HttpResponse(ctime(),mimetype='text/plain')

#p37 404エラーレスポンス
from django.http import Http404

def hello_error(request):
   """Simply raise Http404
   """
   raise Http404

from django.http import HttpResponseForbidden

#p37 403エラーレスポンス
def forbidden_page(request):
   """Simply returns 403 Forbidden code.
   """
   return HttpResponseForbidden()

#p38 google リダイレクト
from django.http import HttpResponseRedirect

def redirect_to_googlemap(request,latitude,longitude):
   redirect_url='http://maps.google.co.jp/?ie=UTF8&ll=%s,%s&z=10' %(latitude,longitude)
   return HttpResponseRedirect(redirect_url)

#p38 リクエストからIPアドレス取得
def your_ip_address(request):
       """Displays source IP address of request
       """
       return HttpResponse(request.META['REMOTE_ADDR'],mimetype='text/plain')

#全リクエストデータ
def all_request_data(request):
       i="<html><body>"
       for item in request.META:
           i=i+'<br>'+item+":"+str(request.META[item])

       i=i+"</body></html>"
       return HttpResponse(i)

#p38 formdata get
def greet_with_form_data(request):
   given_name=request.GET['given_name']
   family_name=request.GET['family_name']
   return HttpResponse('Heloo,%s %s!' %(given_name,family_name))

#39 正規表現 の例
def reverse_url_bit(request,bit=''):
   """Displays reversed url bit,which is captured in urlconf.
   """
   return HttpResponse(reversed(bit),mimetype='text/plain')

#40 数字の正規表現
def url_sum(request,a,b):
   """Displays arithmetic sum of urls bits.
   """
   a_int=int(a,10)
   b_int=int(b,10)
   return HttpResponse(str(a_int+b_int),mimetype='text/plain')

#全リクエストデータ テンプレートを使用
from django.template import Context,loader

def show_metadata(request):
   template=loader.get_template('showmeta.html')
   context=Context()
   context.update({'metadata':request.META})
   return HttpResponse(template.render(context))

#p44 親テンプレートで表示
def show_base(request):
   template=loader.get_template('base.html')
   context=Context()
   context.update({'title':'これはタイトル'})
   context.update({'content':'これは内容'})
   return HttpResponse(template.render(context))

#p45 子テンプレートで表示
def show_child(request):
   template=loader.get_template('child.html')
   context=Context()
   context.update({'title':'これはタイトル'})
   context.update({'content':'これは内容'})
   return HttpResponse(template.render(context))

urls.py

from django.conf.urls.defaults import *
from hello_view import *
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns(
   '',
   # Example:
   # (r'^mysite/', include('mysite.foo.urls')),
   (r'^greet/$',hello),
   (r'^greet_2/$',plaintext_time),
   (r'^greet_3/$',hello_error),
   (r'^greet_4/$',forbidden_page),
   (r'^greet_5/$',redirect_to_googlemap,dict(latitude=29.976797,longitude=31.131520)),
   (r'^greet_6/$',your_ip_address),
   (r'^greet_7/$',all_request_data),
   (r'^formdata/$',greet_with_form_data),
   (r'^reversed/(?P<bit>.*)/$',reverse_url_bit),
   (r'^sum/(\d+)/(\d+)/$',url_sum),
   (r'^greet_8/$',show_metadata),
   (r'^greet_9/$',show_base),
   (r'^greet_10/$',show_child),
   # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
   # to INSTALLED_APPS to enable admin documentation:
   # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
   # Uncomment the next line to enable the admin:
   # (r'^admin/(.*)', admin.site.root),
)

settings.py

TEMPLATE_DIRS の部分 この設定は後からも前提になっていて、飛ばすとエラーになる
TEMPLATE_DIRS = (
   # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
   # Always use forward slashes, even on Windows.
   # Don't forget to use absolute paths, not relative paths.
   '/home/felix/www/python/mysite/templates/',
)

formdata_home.html

P38のGETデータ送信用のHTMLどこに置いてもよいけど、これは、通常のHTMLで、http:/localhost/www/python/mysite/formdata_home.html の様なURLで開く必要があります。
<html>
	<body>
		<form action='http://localhost:8000/formdata/' method='GET'>
			<p>Given name<input name="given_name" type="text"/></p>
			<p>Family name<input name="family_name" type="text"/></p>
			<p><input type='submit' value='hello' /></p>
		</form>
	</body>
</html>

show_metaのテンプレート

<html>
<body>
   <table>
       <tr><td>Key</td><td>Value</td></tr>
       {% for item in metadata.items %}
       <tr><td>{{ item.0 }}</td><td>{{item.1}}</td></tr>
       {% endfor %}
   </table>
</body>
</html>

base.html

<html>
	<head>
		<title>{{ title }}</title>
		{% block head_extra %}
		{% endblock %}
	</head>
	<body>
		{% block body %}
			{{ content }}
		{% endblock %}
	</body>
</html>

child.html

base.htmlを継承するファイルの方
{% extends "base.html" %}
{% block head_extra %}
	<eta http-equiv="content-type=:text/html; charset=UTF8" />
{% endblock %}
{% block body %}
	<h1>{{ title }}</h1>
	<hr />
	{{ content }}
	<hr />
{% endblock %}