仕組み
ユーザがURLを叩いた時=>urls.pyで該当のビューが呼び出され=>
・リクエストされたURLとビューのマッピング定義は、urls.pyに記載
・よびだすHTML文書(template)とフィールドの定義は、views.pyに記載
views.pyに定義された、
ビュー関 数の第一引数には HttpRequest が、それ以降の引 数には正規表現でキャプチャした値が渡され、
URL 中の値を取り出すには、正規表現にて、単に丸括弧で囲むだけです。
例えば、 (r’^articles/(\d{4})/(\d{2})/$’, ‘news.views.month_archive’)と定義されており、合致するリクエスト、/articles/2005/03/ が来た場合、
ビュー関数、news.views.month_archive(request, '2005', '03') を 呼び出します。第二引数、第三引数に2005,03がそれぞれ入ります。
^ ・・・行頭にマッチ。\d・・・0-9の数字。{m}・・・前にある RE の m 回の正確なコピーとマッチ。\d{4}は4桁の0-9の数字。$・・・行尾をさす。
(?P<name>pattern) ・・・名前つきの 正規表現グループで URL から情報を取り出し、ビュー の キーワード引数 に渡す
・templateはbase.htmlやそのたhtmlファイルに記載
・データベースに格納するテーブル、フィールドの定義は、models.pyに記載
urls.pyのurl関数は、正規表現を持ちいる。
正規表現例
‘^’ |
文字列の先頭とマッチします |
‘+’ |
直前にある RE に作用して、RE を、1 回以上繰り返したものにマッチさせるようにします。例えば ab+ は ‘a’ に一つ以上の ‘b’ が続いたものにマッチし、’a’ 単体にはマッチしません |
‘$’ |
文字列の末尾、あるいは文字列の末尾の改行の直前にマッチします。例えば、foo は ‘foo’ と ‘foobar’ の両方にマッチします。一方、正規表現 foo$ は ‘foo’ だけとマッチします。興味深いことに、’foo1\nfoo2\n’ を foo.$ で検索した場合、通常のモードでは ‘foo2’ だけにマッチし、MULTILINE モードでは ‘foo1’ にもマッチします。$ だけで ‘foo\n’ を検索した場合、2箇所 (内容は空) でマッチします: 1つは、改行の直前で、もう1つは、文字列の最後です。 |
¥d |
任意の Unicode 10進数 (Unicode 文字カテゴリ [Nd]) とマッチします |
(?P<name>…) |
(?P<name>…) はグループに名前 name を付けます。 |
Django用語 |
意味 |
テンプレート |
Django ではテンプレートという仕組みによって、HTML によるビューをロジックから分離している。Webブラウザで表示させるhtmlのことをテンプレートという |
マイグレーション |
Djangoで内部的に利用しているデータベースのスキーマを変更することをMigrationという
Migrationって? http://blog.hoerin.com/category/python/ |
モデル |
モデルとはサイトを構成するデータの、唯一絶対的なデータソースを指します。 モデルには、保存したいデータを表すデータフィールドと、データのビヘイビアを 定義します。通常、一つのモデルは一つのデータベーステーブルに対応しています。 |
URLConf |
URL 構造を定義す るには、 URLconf と呼ばれる Python モジュールを作成します。 Django は URLconf を使ってどの URL をどの Python コードに関連づけるかを決めています
URL パターン (単純な正規表現) から Python のコールバック関数 (自作のビュー) へのマッピングが入っている
URLConf(urls.py)の一例
|
from django.conf.urls import patterns, url, include urlpatterns = patterns('', (r'^articles/2003/$', 'news.views.special_case_2003'), <=ユーザアクセスURLがこの正規表現にマッチした場合、views.py内に定義されているspecial_case_2003メソッドが呼ばれるということ (r'^articles/(\d{4})/$', 'news.views.year_archive'), (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'), (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'), ) |
|
正規表現文字列のリテラルの前に <tt>'r'</tt> があります。これは必須ではあり ませんが、付けた方がよいでしょう。 <tt>r</tt>は、”raw” 文字列、すなわち文 字列中のいかなる文字もエスケープしないことを表します |
|
テンプレート |
Djangoはテンプレートファイル(html)を呼び出し、WEB画面のデザインのテンプレートとして表示させる |
Django テンプレート言語 |
テンプレートの表記法。Pythonとは違った文法。
コンテキスト (context) はテンプレートに渡される「変数名」から「変数の値」 へのマッピング.
|
>>> from django.template import Context, Template >>> t = Template("My name is {{ my_name }}.") >>> c = Context({"my_name": "Adrian"}) <==変数名my_nameにAdrianをいれる >>> t.render(c) "My name is Adrian." |
|
<span style="color: #888888;">例その2↓</span> |
|
books = Book.objects.all().order_by('id') <span style="color: #ff0000;"><==books変数にBookテーブルのオブジェクトをすべて入れる</span> return render_to_response('cms/book_list.html', # 使用するテンプレート {'books': books}, # テンプレートに渡すデータ <span style="color: #ff0000;"><=上記のbooksの配列をtemplate(book_list.html)内のbooksに格納する</span> context_instance=RequestContext(request)) |
|
book_list.html内では↓のようにbooksがfor文の中で使われる |
|
<tbody> {% for book in <span style="color: #ff0000;">books </span>%} <==つまり、views.pyでとってきたオブジェクトに対して、 <tr> テーブルにid,name,publisher,pageを表示させる <td>{{ book.id }}</td> <td>{{ book.name }}</td> <td>{{ book.publisher }}</td> <td>{{ book.page }}</td> <td> <a href="{% url 'cms:book_mod' book_id=book.id %}" class="btn btn-default btn-sm">修正</a> <a href="{% url 'cms:book_del' book_id=book.id %}" class="btn btn-default btn-sm">削除</a> </td> </tr> {% endfor %} |
|
IDLE |
PYTHONインストすると自動で入るコマンドインタフェース。C:\Python34\Lib\idlelibにidle.batが含まれており、それで起動する。 |
文法 |
解説 |
__str__(self): |
データベースから返される文字列は全て Unicode 文字列であり、メソッドにこの__str__を定義しておくと、戻り値をUnicodeに変換して返してくれる。この定義がないと、具体的な格納値がDjango adminなどから確認できない。 |
|
|
I
Djangoの始め方
1.projectの作成 ↓たとえばmysiteというプロジェクトを作る
django-admin.py startproject mysite
上記コマンドを実行したカレントフォルダにmysiteフォルダができる
↓このようなファイル構成
mysite
|
| manage.py
|
\—mysite
settings.py
urls.py
wsgi.py
__init__.py
2.データベースのセットアップ ↓データベースの設定は、settings.py にありますが、標準では、SQlite3を使うよう設定済
python manage.py migrate
3.スーパーユーザーを作成
python manage.py createsuperuser
C:\Python34\mysite>python manage.py createsuperuser
Username (leave blank to use ‘hide’): admin
Email address:
Password:
Password (again):
Superuser created successfully.
4.開発サーバの起動
python manage.py runserver
5.アプリケーションの作成
アプリケーションは、プロジェクトを構成する機能の単位で、場合によっては再利用の対象とできる単位
python manage.py startapp cms
6.データベースに定義したいデータ モデルを、cms/models.py に定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
from django.db import models class Book(models.Model): '''書籍''' name = models.CharField(u'書籍名', max_length=255) publisher = models.CharField(u'出版社', max_length=255, blank=True) page = models.IntegerField(u'ページ数', blank=True, default=0) def __str__(self): # Python2: def __unicode__(self): return self.name class Impression(models.Model): '''感想''' book = models.ForeignKey(Book, verbose_name=u'書籍', related_name='impressions') comment = models.TextField(u'コメント', blank=True) def __str__(self): # Python2: def __unicode__(self): return self.comment |
7.モデルを有効にする
cms アプリケーションをインストールしたことを、プロジェクトに教えてあげる必要があります。/settings.py の INSTALLED_APPS の最後に cms を追加。
|
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'cms', ) |
8.言語とタイムゾーンを日本にします
|
# Internationalization # https://docs.djangoproject.com/en/1.6/topics/i18n/ # LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'ja' # TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Tokyo' |
9.以下のコマンドで、models.py の変更を拾って、マイグレーションファイルを作成
python manage.py makemigrations cms
10.このマイグレートファイルが、どのような SQL になるか、以下のコマンドで確認
python manage.py sqlmigrate cms 0001
11.まだデータベースに反映していないマイグレートファイルを、以下のコマンドでデータベースに反映
python manage.py migrate
12.管理サイトの有効化
管理サイトというものがあって、ここからマスターメンテナンス的なデータ投入がすべてできてしまいます。
1python manage.py runserver で開発用サーバを起動します。
2http://127.0.0.1:8000/admin/ にブラウザでアクセスします。
3初回の $ python manage.py createsuperuser で初期化したスーパーユーザー admin/admin でログインします。
13 cms モデルを admin 上で編集できるようにする
cms/admin.py に、管理サイトへ表示したいモデルを追加
|
# -*- coding: utf-8 -*- from django.contrib import admin from cms.models import Book, Impression admin.site.register(Book) admin.site.register(Impression) |
14 データの追加、修正、削除を確認
管理サイトの一覧を見た時、models.py の
|
def __str__(self): # Python2: def __unicode__(self): |
で設定したものが、レコード名として見えています。
15もう少しレコードの項目全体が見えるよう、cms/admin.py を修正
|
# -*- coding: utf-8 -*- from django.contrib import admin from cms.models import Book, Impression # admin.site.register(Book) # admin.site.register(Impression) class BookAdmin(admin.ModelAdmin): list_display = ('id', 'name', 'publisher', 'page',) # 一覧に出したい項目 list_display_links = ('id', 'name',) # 修正リンクでクリックできる項目 admin.site.register(Book, BookAdmin) class ImpressionAdmin(admin.ModelAdmin): list_display = ('id', 'comment',) list_display_links = ('id', 'comment',) admin.site.register(Impression, ImpressionAdmin) |
モデルに追加したテーブルの一覧、登録、修正、削除が簡単にできました
Bootstrapの導入
Bootstrap で必要な jQuery を含めて、以下からダウンロード
ダウンロードしたファイルを、mybook プロジェクト ディレクトリの下に static というディレクトリを作って、以下のように配置
この static というディレクトリは、mybook/settings.py の STATIC_URL で指定されたディレクトリ
ここを探してくれるよう、mybook/settings.py の最後に、STATICFILES_DIRS を追加
|
# 静的ファイルを共通で置く STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) |
django-bootstrap-form
一覧系HTMLは、Bootstrapで必要なclassを手書きして、登録/修正のフォーム系HTMLは django-bootstrap-form という Python モジュールを使います。
|
pip install django-bootstrap-form |
mybook/settings.py の INSTALLED_APPS に ‘bootstrapform’ を追加
一覧、登録、修正、削除のファンクションが必要なので、`cms/views.py’ にひな形を作る
cms/urls.py というファイルは存在しないので、新しく作る。この中で、URLと、ビューのファンクションの紐付けを行う
============================
Djangoのバージョン確認
C:\Python34>pip freeze|find “Django”
Django==1.8.3
1.setting.pyに以下を記載
EMAIL_HOST=’SMTPサーバ名’
EMAIL_PORT = 25
EMAIL_HOST_USER = ”
EMAIL_HOST_PASSWORD = ”
EMAIL_USE_TLS = False
2.views.pyに以下を記載
from django.core.mail import EmailMessage
def <ここにview名>(request):
email = EmailMessage(‘Hello’, ‘World’, to=[‘root@test.com’])
email.send()
viewが呼ばれた瞬間にメールが対象のSMTPサーバ宛に飛ぶ
タイトルの通り、同一フォーム内でクリックしたボタンによって異なる処理を行いたい場合は以下のように書きます。
hoge.html
|
<form action="{% url 'hoge.views.some_view' %}" method="post"> {% csrf_token %} <input type="text" name="hoge" value=""> ... <input type="submit" name="button_1" value="ボタン1"> <input type="submit" name="button_2" value="ボタン2"> </form> |
views.py
|
def some_view(request): if request.method == 'POST': if 'button_1' in request.POST: # ボタン1がクリックされた場合の処理 hoge1() elif 'button_2' in request.POST: # ボタン2がクリックされた場合の処理 hoge2() |
Djangoで使える開発用SMTPサーバ
メール挙動の確認のために、開発用SMTPサーバが用意されている
以下を一行で実行すれば、1025番でSMTPサーバが立ち上がる。
|
python -m smtpd -n -c DebuggingServer localhost:1025 |
Djangoの設定はsettings.pyにいろいろ書かれています。
なので自分が作成するアプリケーション用の設定も同じく書いておきたいわけです。
それは、
http://djangoproject.jp/doc/ja/1.0/topics/settings.html#topics-settings
にちゃんと書いてあるので、そこを見ればOKです。
要約すると
settings.pyには、普通にオリジナルの設定を他の既存のパラメータと同様な感じで定義できます。
例えば、
MY_CONF = ‘test conf’
とか普通に書きます。
使うときですが、利用するファイルで
from django.conf import settings
として、
val = settings.MY_CONF
で利用できます。
|