"django" カテゴリのページ

Django: 強制的にINSERTする方法

Djangoでは、save()を使ってレコードを作成したり更新したりすると思います。

オブジェクトが新規作成される場合はINSERT。そうでない場合はUPDATEとDjango側が自動的に切り分けてくれます。

これは、DBレイヤーでは、

  • オブジェクトが持つ主キーがDB中に存在しない=INSERT
  • オブジェクトが持つ主キーがDB中に存在する=UPDATE

ということをしてくれています。

 

でも、毎回必ずINSERTしたい場合はどうでしょう?

Djangoで使えるWYSIWYGエディタアプリ

2011/04/19

WYSIWYGエディタは、近年のWebのシステム化において非常に重要なウェイトを占めるようになってきています。

Djangoでも、いくつかWYSIWYGエディタをエンベットできるアプリが登場してきています。

今日は、これらアプリについて簡単な紹介をしたいと思います。

Django: キャッシュ(memcache)を設定して超高速化を実現する方法

Djangoには、キャッシュバックエンドとして様々な機構をサポートしています。

  1. メモリキャッシュ
  2. データベースキャッシュ
  3. ファイルキャッシュ

また、バックエンドとは別に、キャッシュ化できるデータの単位も様々です。

  • サイト全体をキャッシュ化
  • ビュー単位でキャッシュ化
  • テンプレートの一部をキャッシュ化
  • オブジェクトの単位でキャッシュ化

特に「オブジェクト単位」でキャッシュ化できるため、原理的には変数ひとつだけをキャッシュデータ化することも可能で、まさに究極の粒度をもったキャッシュ機能であると言えます。

また、もっと上流のキャッシュ機能とDjangoベースのWebサーバーを連携させることも可能です。例えば、squidなどのProxyベースのキャッシュ機能との連携がそれに該当します。

まさに、なんでもあり、のDjangoキャッシュ機能ですが、今回はその中でも最も高速なメモリベースのキャッシュを中心に、キャッシュの設定方法を見ていきましょう。

Django: サイトマップの生成方法

サイトマップを作成すると、Google, Bingなどの検索エンジンに効率的にクローリングしてもらえるようになるだけでなく、ホスティングしているページ全体に対して、何割がインデックスされているのか?検索エンジンの進捗を確認することが可能となり、SEO効果が期待できます。
しかし、サイトマップ一つとっても、そのフォーマットを覚えたり、XMLを整形したりするために多分の労力を払う必要があり、容易ではありません。

しかし、Djangoにはサイトマップを簡単に作成する機能が組み込まれています。
この機能を提供するのが、 django.contrib.sitemap クラスです。

開発者は、モデルに対するサイトマップクラスを定義するだけで、サイトマップ用のビューを生成することが可能です。

簡単なアプリを例にとり、サイトマップの作成方法を見ていきましょう。

Django: ミドルウェアの実装方法(全てのビューに処理をフックする方法)

Djangoでは、アプリ、context_processorsなど様々なプラグイン機能が提供されており、画一的なフレームワークの中でソフトウェアを実装することで効率化・高可搬性を実現しています。

しかし、一旦システムを実装開始すると、システムは様々な環境が依存しあうもので、一つの関数を書き換えると様々なビューやテンプレートファイルに修正範囲が波及する。。。なんてことがよく起こります。

せっかくMVCフレームワークを提供しているのに、それを正しく使わないのが悪い!などと怒られそうですが、理想と現実は異なる訳で、プラットフォームにはそのどちらもフォローできる柔軟な環境が求められます。

既存のシステム全てに共通で処理をフックしたり、テンプレート変数を追加したい。。。などということを実現するにはどうしたら良いのでしょうか?

これを簡単に実現できる方法がDjangoにはあります。
それがミドルウェアです。

Django: URLの逆引き方法

Djangoでは、ビュー関数名やビューに付けた名前(=名前付きURLパターン)から対応するURLを逆引きする機能をサポートしています。

これを URLの逆引き と呼びますが、この機能を使うとHTML上でURLを直接記述する必要がなくなり、アプリケーションの可搬性が高まります。つまり、通常URL設計を変更する場合、テンプレートやビュー内で変更対象となる部分を書き換える必要が出てきますが、このような書き換え作業から開放されるのです。

それでは、URLの逆引き方法を見てみましょう。

Django: context_processorsの使い方

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クラスの設定あれこれ

Djangoでモデル定義から直接フォームクラスを自動生成する方法については、ModelFormクラスを用いればよいと解説してきました。

ModelFormカテゴリの記事一覧

 

しかし、モデルではフィールド定義してるけど、フォームを表示する際は表示する必要のないものや、ヘルプメッセージをどうやって表示すればよいのか?など、使うときに迷うこともあります。

今回は、このような細やかな要求をどうやって実現するのかについて、ノウハウメモ的に解説していきます。

Django: クラス名を交互に付与する方法

HTMLを記述する場合に、

    <div class="odd"></div>
    <div class="even"></div>
    <div class="odd"></div>
    <div class="even"></div>
    ...

などと、クラス名を交互に切り替えたい場合があります。

このような場合、Djangoならばテンプレートフィルタの「cycle」を使って簡単に実現できます。

django evolutionを用いて、モデル定義の変更・削除に対応する

Djangoは、クラス定義(モデル)とデータベーステーブルとを関連付けるORM(Object-Relation Model)というフレームワークを採用しています。そのため、SQLやRDBのことが分からなくても、Python & Djangoの知識だけである程度データベースを利用することができます。

データベースとしては、PostgreSQL / MYSQL / Sqlite などが利用可能ですが、これらすべてが既存のテーブルに対して、カラムの追加・変更・削除処理をサポートしている訳ではありません。例えば、PostgreSQLはカラムの追加はできますが、変更(型や名前の変更など)はできません。

これらは、サポートしているデータベースが提供しているサービスで、共通部分のみしか使わないというDjangoの思想に基づいています。なので、モデル定義の変更・削除も同様に、

    $ python manage.py syncdb

では対応できないのです。

これを解決するためのDjangoアプリケーションがあります。
django-evolution」です。
これを使えば、モデルの変更・削除が実現できます。

Pinax0.7.1のインストール方法

今回は、Pinaxのインストール方法について説明します。Pinaxのインストールは前バージョンである0.5.1から大きく様変わりしています。前回までは、Pinax自体のパッケージをPythonパスの通ったところに配置するだけでよかったのですが、今回はインストーラが附属していたり、Pinaxが動作するために必要な外部パッケージ(Djangoなど)も同時にインストールされるようになっています。

Djangoのアプリ集「Pinax」

2010/02/16

Pinaxは、Djangoフレームワークで実装されたアプリケーション集です。

デフォルトのテンプレートも最初から提供されているため素早くサイトを立ち上げることが可能です。

用途に応じて、個人のブログサイトやコーポレートサイト、エンタープライズ用途のCMSに至るまで様々なデフォルトプロジェクトも予め用意されており、30〜40個のアプリのどれをインストールして使えばよいか悩むこともありません。

今回は、Pinaxの全容を紹介します。

Django: Adminページのカスタマイズ方法

関連記事



前回、テンプレートの検索順序とオーバーライド方法について説明しました。
今回はこの仕組みを利用してAdminサイトの見栄えを変更する方法を説明します。

Django: テンプレートの検索順序とオーバーライド

Djangoのテンプレートは、{% extends "hoge.html" %}や{% include "hoge.html" %}などの タグと{{hogevar}}の変数と定数文字列からなっています。

テンプレートを理解する上でもう一つ重要なのが、テンプレートのオーバーライドです。 テンプレートはある規則に従ってファイルシステム内を検索されます。
#正確には、templatedbなどのDBベースのテンプレートデータも存在していますが。
オーバーライドをマスターすると、アプリごとにHTMLを変更したいものだけ別ディレクトリで管理する ことができるようになり、どれくらいの差分開発が発生したかを理解するのに役立ちます。

Django: モデルクラスから自動的にフォームクラスを生成する方法

Djangoでは、モデルを定義するとそのままフォームを生成してくれる機能があります。
ModelFormという機能で、以下のように自動生成したいフォームクラスのメタクラスに、実際にデータが保存されるモデルクラス名を指定するだけです。

Django: モデル間のリレーションを定義する方法

RDBの世界では、正規化の際にテーブルとテーブルの対応関係を定義することがあります。 Djangoが採用しているO/Rマッパの世界でもリレーションを定義することが可能で、以下2つの メソッドが用意されています。

例として、Djangoの既存んモデルクラスであるUserを拡張する例を記述いたします。

Djangoのサンプルソース集を集めたサイト「django snippets」

django snippetsはDjangoのいろいろなアプリを ソース付きで紹介しているサイトです。 このようなサイトはdjango以外でもなかなか無いと思いますので、貴重ですね〜。

ありがたや。ありがたや。

Python: DjangoをApacheから呼び出せるようにする方法

関連記事



Djangoはそれ自体に簡易Webサーバを搭載しています。
しかしそれを使えるのはせいぜいプロトタイプ開発までで、実運用時はApacheなどの 本格的なサーバを使用することになります。Apacheからdjangoのハンドラ群を呼び出せるように するための設定を以下に説明していきます。

PythonベースのWeb開発フレームワーク:Django

2010/02/14

DjangoはPythonベースのMVCモデルのWeb開発フレームワークです。
Django本家によると、 Djangoの特徴としては、以下が挙げられるようです。

Python: Django1.0(Postgresql, psycopg)をMacOSXにインストールする方法

Djangoは、PythonでMVC開発するためのWeb開発フレームワークです。
いわばRuby on RailsのPython版といったところでしょうか。

 ・ Django日本版
 ・ Django本家

これをMacにインストールするためには、
Django、RDBモジュール(Postgresql, MySQLなど)、psycopgなどのPython-RDB間を つなぐI/Fモジュールが必要です。

Django: Djangoを使ったバッチ処理の実装方法

Djangoでは、Webアプリ以外にバッチ処理を実装することができます。 バッチ処理は、manage.pyのオプション処理として実現します。

実装するバッチ処理は「アクション」と呼ばます。
アクションをmanage.pyに追加するには、プロジェクトディレクトリorアプリケーションディレクトリ 直下に「management/commands」というディレクトリを作成し、commands配下にアクションを実行する スクリプトを実装することで実現されます。

カテゴリー