RubyistのためのDjango入門

自己紹介

岡野真也(tokibito/nullpobug)

Djangoって何だ

Django

Python?

Python

FizzBuzz

for i in range(1, 100):
    if i % 15 == 0:
        print "FizzBuzz"
    elif i % 3 == 0:
        print "Fizz"
    elif i % 5 == 0:
        print "Buzz"
    else:
        print i

リスト

>>> a = [1, 2, 3, 4, 5]
>>> a[0]
1
>>> a[2:]
[3, 4, 5]
>>> a[-1]
5
>>> b = [1, [2, 3], 4, 5]
>>> b[1][0]
2
>>> b[1:3]
[[2, 3], 4]

辞書

>>> a = {'hoge': 1, 'fuga': 'ruby'}
>>> a['hoge']
1
>>> a['fuga']
'ruby'

クラス

class MyClass(object):
    def __init__(self):
        self.hoge = 'fuga'
    def say_foo(self):
        print 'foo'

myinst = MyClass()
print myinst.hoge
myinst.say_foo()

ところで

Rubyistのための?

Rubyistのための?

RubyistにPythonを知ってほしい!

では、特徴を説明する前に

実績を見てもらおうかと

Djangoの実績

LJWorld.com

LJWorld.com

http://www2.ljworld.com/

ReviewBoard

ReviewBoard

http://review-board.org/

Google App Engine

Google App Engine

http://code.google.com/appengine/

どう書く?.org

どう書く?.org

http://ja.doukaku.org/

gumi

gumi

http://gu3.jp/

monologista

monologista

http://monologista.jp/

Djangoの特徴

特徴

特徴

特徴

Model-Template-View

Model-View-Template

DjangoのMVCモデルの解釈

O/Rマッパー

テーブルの作成

モデル

from django.db import models
from datetime import datetime

class Tag(models.Model):
    name = models.CharField(max_length=50)

class Entry(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    pub_date = models.DateTimeField(default=datetime.now)
    tags = models.ManyToManyField(Tag, blank=True)

モデル

from models import Entry
entry = Entry() # Entryオブジェクトを作成
entry.title = u"Ruby勉強会"
entry.content = u"Django入門"
entry.save() # データベースに保存

entry = Entry.objects.get(pk=1) # プライマリキー指定
entries = Entry.objects.all() # Entryすべて

# 条件指定
entries = Entry.objects.filter(title__startswith=u'Ruby')

正規表現を用いたURL設計

URL設計

from blog.views import index, detail
urlpatterns = patterns('',
    # '/'にマッチ
    (r'^$', index),

    # '/1234/'などにマッチ
    (r'^(?P<object_id>\d+)/$', detail),

    # '/admin/'にマッチ
    (r'^admin/', include('django.contrib.admin.urls')),
)

強力なテンプレートエンジン

テンプレートエンジン

テンプレートエンジン

<html>
<head>
  <title>{% block title %}ほげ{% endblock %}</title>
</head>
<body>
  {% block main %}{% endblock %}
</body>
</html>

テンプレートエンジン

{% extends "base.html" %}

{% block title %}ブログ{% endblock %}

{% block main %}
  {% for entry in object_list %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.content|urlize|linebreaksbr }}</p>
  {% endfor %}
{% endblock %}

ビュー関数

ビュー関数

ビュー関数

from django.template import Context, loader
from django.http import HttpResponse
from blog.models import Entry
def index(request):
    object_list = Entry.objects.all()
    t = loader.get_template('index.html')
    c = Context({
        'object_list': object_list,
    })
    return HttpResponse(t.render(c))

汎用ビュー

汎用ビュー

汎用ビュー

from django.views.generic.simple import direct_to_template
from blog.models import Entry
def index(request):
    return direct_to_template(request,
            extra_context={'object_list': Entry.objects.all()})

汎用ビュー

from django.conf.urls.defaults import *
from blog.models import Entry
urlpatterns = patterns('django.views.generic.simple',
    (r'^$', 'direct_to_template',
            {'queryset': Entry.objects.all()}),
)

カッコいい管理画面

管理画面

管理画面

フォーム生成とバリデーション

フォームクラス

フォームクラス

from django import newforms as forms
from blog.models import Tag
class EntryForm(forms.Form):
    title = forms.CharField(max_length=30,
        widget=forms.TextInput, label='Title')
    content = forms.CharField(
        widget=forms.Textarea, label='Content')

出力されるタグ

>>> form = EntryForm()
>>> print form.as_p()
<p><label for="id_title">Title:</label> <input id="id_title"
 type="text" name="title" maxlength="30" /></p>
<p><label for="id_content">Content:</label> <textarea id="id_content"
 rows="10" cols="40" name="content"></textarea></p>

モデルからフォームを生成

ModelFormクラス(開発版)

from django import newforms as forms
from blog.models import Entry
class EntryForm(forms.ModelForm):
    class Meta:
        model = Entry
        fields = ('title', 'content',)

バリデーション

form = EntryForm(request.POST)
if form.is_valid():
    form.save()

開発用サーバ

開発用サーバ

動作が高速

動作

国際化対応(i18n)

国際化

プロジェクトの構造

プロジェクトの構造(一例)

- myproject
  __init__.py    .. Pythonのモジュールに必要
  settings.py    .. 設定ファイル
  manage.py
  urls.py
  - blog        .. Blogアプリケーション
    __init__.py
    models.py
    views.py
  - wiki        .. Wikiアプリケーション
    __init__.py
    models.py
    views.py
  - static       .. 静的ファイル
    - img
  - templates    .. テンプレートディレクトリ
    base.html
    - blog
      entry_list.html
      entry_detail.html
    - wiki
      page_list.html

初めてのDjango

事前に必要なもの

Djangoのバージョン

開発版はインストールで注意

国内のDjango事情

Djangoの情報

時間があれば何か作る

おまけ

このプレゼンツールでもDjangoを使ってます!

おしまい

ご清聴ありがとうございました