python django 基礎
(IT寺小屋)紗音寺
URL: http://atnd.org/events/40589
@jbking
村岡
バージョン0.96から
メガフレームワーク
scaffold adminなど
→ これ使うからDjango使う意味がある
MTV != MVC
感心事が違う
内部的にはControllerがある
ModelとTemplateは必須ではない
→ データを保存するのでは無ければ
Form・・・データチェックしたものを書く
Viewの中にバリデーションのチェックをする人もいる。
が、FormのModelForm使うほうが楽。
Controllerは独立していてgenericビューがある。
ControllerがViewの一部を担うことがある。
admin・・・モデルの生成や編集できる。管理用アプリケーション。
Djangoがインストールされてなくてもできる
・Nitrous
https://www.nitrous.io/
これですすめる!
・github
https://github.com/jbking/django_learning/
・urls.py
django-admin.py startproject django_lessons
cd django_lessons
chmod +x manage.py
./manage.py help
コメントアウトを外す
from django.contrib import admin admin.autodiscover() url(r'^admin/', include(admin.site.urls)),
settings.py
'django.contrib.admin',
./manage.py syncdb ./manage.py runserver 0.0.0.0:8080
./manage.py syncdbのあとにyesをし、名前、メアド、パスワードを聞かれるので入れる
その後URLに「admin/」を追加
http://djangotest-15945.apne1.actionbox.io:8080/admin/
admindocsみんな使わないのにある。
syncdbした直後とかでなければサーバを落とさずに編集しても大丈夫なはず。
./manage.py startapp test_app
プロジェクト内の「settings.py」
INSTALLED_APPSに追加
アプリケーションの中に「admin.py」を自分で生成する
・admin.py
./manage.py syncdb
Adaptorになってる。デザインパターンのAdaprorパターン。
from django.contrib import admin from test_app.models import Post, Comment class PollAdmin(admin.ModelAdmin): # ↓カラムに何を表示するのか?を書いている # Modelのメソッド名を書けばそれが表示される list_display = ('subject', 'author', 'shorten_body', 'created_at', 'updated_at') # 日付の階層構造でなにを使うかどうかを記載 date_hierarchy = 'created_at' # フィルタリングを記載しておけばAdminが解釈してくれる list_filter = ['created_at', 'updated_at'] def shorten_body(self, model): if len(model.body) > 100: return model.body[:100] + '...' else: return model.body class CommentAdmin(admin.ModelAdmin): list_display = ('post', 'author', 'shorten_body', 'created_at', 'updated_at') date_hierarchy = 'created_at' list_filter = ['created_at', 'updated_at'] def post_subject(self, model): return model.post.subject def shorten_body(self, model): if len(model.body) > 100: return model.body[:100] + '...' else: return model.body admin.site.register(Post, PollAdmin) admin.site.register(Comment, CommentAdmin)
./manage.py syncdb
・インタラクティブシェル
./manage.py shell
・SQLが見られる
※テーブル定義のみを主力もできる
./manage.py sqlall test_app
・課題1
Postオブジェクトを取り出す
まずAdminのWebで登録しておく、
from test_app.models import Post Post.objects.all()
・課題2
subjectを変えてsaveする
from test_app.models import Post first = Post.objects.get(id=1) first.subject = 'おきかえ' first.save()
http://www.djangoproject.jp/doc/ja/1.0/intro/tutorial01.html
# 出来たオブジェクトをデータベースに保存します。 save() は明示的に呼ば
# ねばなりません。
ないカラム名のものに対して値を入れてもとくに反映されない
違っててもエラーを出すやり方はあるが、面倒なので気をつけるべき
first.hoge = 11
first.save()
Viewを作って、登録をできるように。
POSTをする。CreateできるViewを作る。
フィルタのタグなどは templatetags の中に〜.pyファイルを作成し、
Template上ではこのようにロードする。
{% load post_extras %}
データベースマイグレーション
モデルを書き換えてsyncdbすればできる
しかし、前のカラムが消えてたら怖い。
方法は2あつある。
1.手動でalter tableする
2.South モデル変更を検知して、変更分からSQLを生成してくれる
カラムの200文字だったのを入らなくなったのを500文字にしたい。
カラムを増やす
・アイコンのフォント
http://fontawesome.io/icons/
・responsiveなCSS
http://www.yuiblog.com/blog/2013/06/12/pure-0-2-0/
・↓は古いやりかた
from django.contrib.auth import models as auth_models
をインポートし、
author = models.ForeignKey(auth_models.User)
を使う
・1.5からはこちらが主流
from django.conf import settings
をインポートし、
author = models.ForeignKey(settings.AUTH_USER_MODEL)
ちなみにsettings.pyに実際に書かれていないものはいくつかあり、
差分ななものを記載すればマージされる。
templatetags にはパッケージとして認識させるために __init__.py
が必要。
views.py の 「return reverse('show_post_detail'」 → urls.pyの別名を呼んでいる。