本番運用では静的ファイルはapache等で配信するべきだが、開発段階で静的ファイルを配信したい場合はこうします.
if settings.DEBUG:
urlpatterns += patterns('',
url(r'media/(?P.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),
)
saveした時点でセッションが増えます.
期限切れのセッションは、定期的に削除するようにしましょう.
Paginatorの確認
def test001(request):
'''ページネーターの動作確認'''
objects = ['john', 'paul', 'george', 'ringo']
p = Paginator(objects, 2)
try:
page1 = p.page(3)
except EmptyPage, e:
print e
page1 = p.page(1)
c = dict(
has_next=page1.has_next(),
has_previous=page1.has_previous(),
has_other_pages=page1.has_other_pages(),
next_page_number=page1.next_page_number(),
previous_page_number=page1.previous_page_number(),
start_index=page1.start_index(),
end_index=page1.end_index(),
object_list=page1.object_list,
number=page1.number,
test=None,
)
c = simplejson.dumps(c, sort_keys=True, indent=2 * ' ')
return HttpResponse(c, mimetype='application/json')
すべてのページをjsonにする
def test002(request):
'''ページネーターの動作確認'''
objects = ['john', 'paul', 'george', 'ringo', 'yyy']
p = Paginator(objects, 2)
pageRange = p.page_range
cc = {}
for ipage in pageRange:
page1 = p.page(ipage)
c = dict(
has_next=page1.has_next(),
has_previous=page1.has_previous(),
has_other_pages=page1.has_other_pages(),
next_page_number=page1.next_page_number(),
previous_page_number=page1.previous_page_number(),
start_index=page1.start_index(),
end_index=page1.end_index(),
object_list=page1.object_list,
number=page1.number,
test=None,
)
cc[ipage] = c
ccJson = simplejson.dumps(cc, sort_keys=True, indent=2 * ' ')
return HttpResponse(ccJson, mimetype='application/json')
urlpatterns = patterns('', (r'^publishers/$', ListView.as_view( model=Publisher, context_object_name="publisher_list", )), )
However, there is; you can subclass DetailView and provide your own implementation of the get_context_data method. The default implementation of this that comes with DetailView simply adds in the object being displayed to the template, but you can override it to show more:
でもDetailViewをサブクラス化して、「get_context_data」メソッドをオーバーライドすれば可能だよ.
from django.views.generic import DetailView
from books.models import Publisher, Bookclass PublisherDetailView(DetailView):
context_object_name = "publisher"
model = Publisherdef get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(PublisherDetailView, self).get_context_data(**kwargs)
# Add in a QuerySet of all the books
context['book_list'] = Book.objects.all()
return context
modelsに基づく汎用ビュー
# models.py
from django.db import modelsclass Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()class Meta:
ordering = ["-name"]def __unicode__(self):
return self.nameclass Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField('Author')
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
from django.conf.urls.defaults import *
from django.views.generic import ListView
from books.models import Publisherurlpatterns = patterns('',
(r'^publishers/$', ListView.as_view(
model=Publisher,
)),
)
{% extends "base.html" %}{% block content %}
Publishers
{% for publisher in object_list %}
- {{ publisher.name }}
{% endfor %}
{% endblock %}
Class-based generic views (and any class-based views that inherit from the base classes Django provides) can be configured in two ways: subclassing, or passing in arguments directly in the URLconf.
クラスベースの汎用ビューは2つの方法で設定できる.サブクラス化するか、またはURLconfの中で直接引数を渡すか、である.
# some_app/views.py
from django.views.generic import TemplateViewclass AboutView(TemplateView):
template_name = "about.html"
# urls.py
from django.conf.urls.defaults import *
from some_app.views import AboutViewurlpatterns = patterns('',
(r'^about/', AboutView.as_view()),
)
from django.conf.urls.defaults import *
from django.views.generic import TemplateViewurlpatterns = patterns('',
(r'^about/', TemplateView.as_view(template_name="about.html")),
)
1.3では汎用ビューがクラスになったそうで.今までは関数で実装されていたのは削除されたらしい.これでどういう便利さをもたらしたのかを検証してみたい.(続きはそのうち・・・)
This is one of the reasons generic views were redesigned for the 1.3 release - previously, they were just view functions with a bewildering array of options; now, rather than passing in a large amount of configuration in the URLconf, the recommended way to extend generic views is to subclass them, and override their attributes or methods.
汎用ビューは1.3リリースで再実装された.以前はなにがなんだか訳がわからないオプションのビュー関数のみであったのだが.今はむしろ多くの設定をURLconfに書いて渡せるし、汎用ビューを拡張する良い方法が、それらをサブクラス化し属性またはメソッドをオーバーライドすることである.(適当訳)
まずはPythonをインストールしましょう.Djangoは、Pythonのバージョン2.5~2.7に対応しています.この時、sqlite3もビルド出来ているか確認します.zlibもyumで前もってインストールしておきましょう.
出来ていない場合は「./configure LDFLAGS='-L/path/to/lib' CPPFLAGS="-I/path/to/include'」あたりを考えてみましょう.(参考:「Building python 2.6 w/ sqlite3 module if sqlite is installed in non-standard location」「2.7.3: sqlite module does not build on centos 5 and Mac OS X 10.4」.結局「」を修正するはめに)
./configure --prefix='/opt/python2.7.3' LDFLAGS='-L/usr/lib' CPPFLAGS="-I/usr/include" CFLAGS="-I/usr/include"
次にDjangoをインストールします.ダウンロードしてきてインストールしたPythonでsetup.pyします.hashlibをインストールするときもこのようにインストールしたいPythonのバージョンで「setup.py」してください.
/opt/python2.7.3/bin/python2.7 setup.py build
(suして)/opt/python2.7.3/bin/python2.7 setup.py install
import django
/opt/python2.7.3/bin/python2.7 /opt/python2.7.3/lib/python2.7/site-packages/django/bin/django-admin.py startproject mysite1_4
この後のアプリケーションの作成とかはこの「mysite1_4」フォルダの中に作成された「manage.py」でできますので、めんどくさいのはここだけです.
ここでエラーが無くプロジェクトが作成されたら、Djangoのインストールは成功しているといってよいと思います.
後でこの「mysite1_4」はrootにオーナーを変更するか、/var/wwwあたりにコピーしてそちらで運用することになりますが、今はここでよいでしょう.
Djangoを起動してみましょう.「cd mysite1_4」して「mysite1_4」ディレクトリに入ります.
/opt/python2.7.3/bin/python2.7 manage.py runserver (このマシンのホスト名):8000
Djangoの稼動確認が終わったところで、mod_wsgiをインストールします.apacheもインストールしておいてください.apacheのdevelもインストールしましょう.インストールしておかないとなにやらapxsが無いとか怒られますし.
mod_wsgiのソースをダウンロード・解凍します.以下のようにしてmod_wsgiをインストールします.
./configure --with-python=/opt/python2.7.3/bin/python2.7
make
(suして)make install
以下のように「/etc/httpd/conf/httpd.conf」を設定します.
LoadModule wsgi_module modules/mod_wsgi.so
Alias /static/ /var/www/Django14/static/
<Directory /var/www/Django14/static>
Order deny,allow
Allow from all
</Directory>WSGIDaemonProcess example.com python-path=/var/www/Django14 processes=5 threads=1
WSGIScriptAlias / /var/www/Django14/mysite1_4/wsgi.py
WSGIPythonPath /var/www/Django14<Directory /var/www/Django14/mysite1_4>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
import os, sys
sys.path.append('/usr/local/django')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
追記:
Djangoのsettings.pyのtimezone設定を「Asia/Tokyo」にしないとapacheのaccess.logの時間も日本時間になりません.
追記2:
staticは以下のような感じでシンボリックリンクを
ln -s /opt/python2.7.3/lib/python2.7/site-packages/django/contrib/admin/static/admin admin