Djangoでは、save()を使ってレコードを作成したり更新したりすると思います。
オブジェクトが新規作成される場合はINSERT。そうでない場合はUPDATEとDjango側が自動的に切り分けてくれます。
これは、DBレイヤーでは、
ということをしてくれています。
でも、毎回必ずINSERTしたい場合はどうでしょう?
WYSIWYGエディタは、近年のWebのシステム化において非常に重要なウェイトを占めるようになってきています。
Djangoでも、いくつかWYSIWYGエディタをエンベットできるアプリが登場してきています。
今日は、これらアプリについて簡単な紹介をしたいと思います。
Djangoには、キャッシュバックエンドとして様々な機構をサポートしています。
また、バックエンドとは別に、キャッシュ化できるデータの単位も様々です。
特に「オブジェクト単位」でキャッシュ化できるため、原理的には変数ひとつだけをキャッシュデータ化することも可能で、まさに究極の粒度をもったキャッシュ機能であると言えます。
また、もっと上流のキャッシュ機能とDjangoベースのWebサーバーを連携させることも可能です。例えば、squidなどのProxyベースのキャッシュ機能との連携がそれに該当します。
まさに、なんでもあり、のDjangoキャッシュ機能ですが、今回はその中でも最も高速なメモリベースのキャッシュを中心に、キャッシュの設定方法を見ていきましょう。
サイトマップを作成すると、Google, Bingなどの検索エンジンに効率的にクローリングしてもらえるようになるだけでなく、ホスティングしているページ全体に対して、何割がインデックスされているのか?検索エンジンの進捗を確認することが可能となり、SEO効果が期待できます。
しかし、サイトマップ一つとっても、そのフォーマットを覚えたり、XMLを整形したりするために多分の労力を払う必要があり、容易ではありません。
しかし、Djangoにはサイトマップを簡単に作成する機能が組み込まれています。
この機能を提供するのが、 django.contrib.sitemap クラスです。
開発者は、モデルに対するサイトマップクラスを定義するだけで、サイトマップ用のビューを生成することが可能です。
簡単なアプリを例にとり、サイトマップの作成方法を見ていきましょう。
Djangoでは、アプリ、context_processorsなど様々なプラグイン機能が提供されており、画一的なフレームワークの中でソフトウェアを実装することで効率化・高可搬性を実現しています。
しかし、一旦システムを実装開始すると、システムは様々な環境が依存しあうもので、一つの関数を書き換えると様々なビューやテンプレートファイルに修正範囲が波及する。。。なんてことがよく起こります。
せっかくMVCフレームワークを提供しているのに、それを正しく使わないのが悪い!などと怒られそうですが、理想と現実は異なる訳で、プラットフォームにはそのどちらもフォローできる柔軟な環境が求められます。
既存のシステム全てに共通で処理をフックしたり、テンプレート変数を追加したい。。。などということを実現するにはどうしたら良いのでしょうか?
これを簡単に実現できる方法がDjangoにはあります。
それがミドルウェアです。
Djangoでは、ビュー関数名やビューに付けた名前(=名前付きURLパターン)から対応するURLを逆引きする機能をサポートしています。
これを URLの逆引き と呼びますが、この機能を使うとHTML上でURLを直接記述する必要がなくなり、アプリケーションの可搬性が高まります。つまり、通常URL設計を変更する場合、テンプレートやビュー内で変更対象となる部分を書き換える必要が出てきますが、このような書き換え作業から開放されるのです。
それでは、URLの逆引き方法を見てみましょう。
Djangoには、テンプレートファイル内でのみ利用できるテンプレート変数と、グローバル変数のように、どのテンプレートファイルからも利用できるテンプレート変数も存在しています。
そのようなグローバル変数的なテンプレート変数のことをcontext_processorと呼びます。settings.pyにて、TEMPLATE_CONTEXT_PROCESSORS変数に、テンプレート変数を返すメソッドを登録しておくと、どのビューからでも当該変数をコンテキストに追加することが可能となります。
$ emacs settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
"hogeapp.context_processors.user_name",
...,
)
$ emacs hogeapp/context_processors.py
def user_name(request):
if ( request.user.is_authenticated() ):
return {"uname": request.user.username}
else:
return {"uname": None}
上記の例は、ログインしている場合に、アカウント名を常に「uname」というテンプレート変数に格納するような設定です。
Djangoでモデル定義から直接フォームクラスを自動生成する方法については、ModelFormクラスを用いればよいと解説してきました。
ModelFormカテゴリの記事一覧
しかし、モデルではフィールド定義してるけど、フォームを表示する際は表示する必要のないものや、ヘルプメッセージをどうやって表示すればよいのか?など、使うときに迷うこともあります。
今回は、このような細やかな要求をどうやって実現するのかについて、ノウハウメモ的に解説していきます。
HTMLを記述する場合に、
<div class="odd"></div>
<div class="even"></div>
<div class="odd"></div>
<div class="even"></div>
...
などと、クラス名を交互に切り替えたい場合があります。
このような場合、Djangoならばテンプレートフィルタの「cycle」を使って簡単に実現できます。
Djangoは、クラス定義(モデル)とデータベーステーブルとを関連付けるORM(Object-Relation Model)というフレームワークを採用しています。そのため、SQLやRDBのことが分からなくても、Python & Djangoの知識だけである程度データベースを利用することができます。
データベースとしては、PostgreSQL / MYSQL / Sqlite などが利用可能ですが、これらすべてが既存のテーブルに対して、カラムの追加・変更・削除処理をサポートしている訳ではありません。例えば、PostgreSQLはカラムの追加はできますが、変更(型や名前の変更など)はできません。
これらは、サポートしているデータベースが提供しているサービスで、共通部分のみしか使わないというDjangoの思想に基づいています。なので、モデル定義の変更・削除も同様に、
$ python manage.py syncdb
では対応できないのです。
これを解決するためのDjangoアプリケーションがあります。
「django-evolution」です。
これを使えば、モデルの変更・削除が実現できます。
今回は、Pinaxのインストール方法について説明します。Pinaxのインストールは前バージョンである0.5.1から大きく様変わりしています。前回までは、Pinax自体のパッケージをPythonパスの通ったところに配置するだけでよかったのですが、今回はインストーラが附属していたり、Pinaxが動作するために必要な外部パッケージ(Djangoなど)も同時にインストールされるようになっています。
Pinaxは、Djangoフレームワークで実装されたアプリケーション集です。
デフォルトのテンプレートも最初から提供されているため素早くサイトを立ち上げることが可能です。
用途に応じて、個人のブログサイトやコーポレートサイト、エンタープライズ用途のCMSに至るまで様々なデフォルトプロジェクトも予め用意されており、30〜40個のアプリのどれをインストールして使えばよいか悩むこともありません。
今回は、Pinaxの全容を紹介します。
関連記事
Djangoのテンプレートは、{% extends "hoge.html" %}や{% include "hoge.html" %}などの
タグと{{hogevar}}の変数と定数文字列からなっています。
テンプレートを理解する上でもう一つ重要なのが、テンプレートのオーバーライドです。
テンプレートはある規則に従ってファイルシステム内を検索されます。
#正確には、templatedbなどのDBベースのテンプレートデータも存在していますが。
オーバーライドをマスターすると、アプリごとにHTMLを変更したいものだけ別ディレクトリで管理する
ことができるようになり、どれくらいの差分開発が発生したかを理解するのに役立ちます。
Djangoでは、モデルを定義するとそのままフォームを生成してくれる機能があります。
ModelFormという機能で、以下のように自動生成したいフォームクラスのメタクラスに、実際にデータが保存されるモデルクラス名を指定するだけです。
RDBの世界では、正規化の際にテーブルとテーブルの対応関係を定義することがあります。
Djangoが採用しているO/Rマッパの世界でもリレーションを定義することが可能で、以下2つの
メソッドが用意されています。
例として、Djangoの既存んモデルクラスであるUserを拡張する例を記述いたします。
django snippetsはDjangoのいろいろなアプリを
ソース付きで紹介しているサイトです。
このようなサイトはdjango以外でもなかなか無いと思いますので、貴重ですね〜。
関連記事
Djangoでは、モデルクラスからフォームクラスを生成する便利な機能を持っています。
フォームの値は大抵の場合、DBに保存することになるでしょうから、これは非常に便利だと思います。
関連記事
Djangoでドロップダウンメニューを作成する場合、ChoiceField()を使用すると思います。
関連記事
DjangoはMVC開発フレームワークとして有名ですが、Ruby on railsのようなアプリライブラリが
デフォルトではほとんど備わってません。そんなかゆいところにも手が届く系のツールを提供してくれるのが
「Pinax」です。
関連記事
Djangoでは、テンプレートファイル内に{{veriable}}と記述すると変数として扱われます。 これをハンドラ側(コントロール側)で定義することによって、様々な変数をマッピングできます。 最も簡単な例を以下に示しましょう。
関連記事
Djangoでモデルを定義しても、特段ユーザが明示しない限りインデックスが付与されることは ありません。インデックスがデフォルトで付与されているのは暗黙のカラムの「id」カラムだけです。
関連記事
先日DjangoでDBにアクセスするための基本設定 にてDBをDjangoから使用するための基本的設定を説明しました。今回は、実際に簡単なモデルを定義してみましょう。
関連記事
Djangoはそれ自体に簡易Webサーバを搭載しています。
しかしそれを使えるのはせいぜいプロトタイプ開発までで、実運用時はApacheなどの
本格的なサーバを使用することになります。Apacheからdjangoのハンドラ群を呼び出せるように
するための設定を以下に説明していきます。
DjangoはPythonベースのMVCモデルのWeb開発フレームワークです。
Django本家によると、
Djangoの特徴としては、以下が挙げられるようです。
Djangoでは、Webアプリ以外にバッチ処理を実装することができます。
バッチ処理は、manage.pyのオプション処理として実現します。
実装するバッチ処理は「アクション」と呼ばます。
アクションをmanage.pyに追加するには、プロジェクトディレクトリorアプリケーションディレクトリ
直下に「management/commands」というディレクトリを作成し、commands配下にアクションを実行する
スクリプトを実装することで実現されます。