django-wordpress-adminを使ってみる

以前書いた記事

MovableTypeのバックアップ

tokibitoさんからコメントを頂き知った

django-wordpress-admin

こいつを使って、

今のMovableTypeのブログをDjango

移行しようと考えてみました。

django-wordpress-admin

GoogleCodeで公開されています。

ここからどうぞ

django-wordpress-adminの中身は、

django-wordpress-admin-read-only/
readme.txt
wordpress/
__init__.py
__init__.pyc
models.py
models.pyc
views.py

内容としては、
models.pyWordPressのDB構成で書かれている。

実際に試してみた。

とりあえずは、

1. MovableTypeがDBを使っていないため、テキスト形式でバックアップ。

2. WordPressをインストール

3. MovableTypeのバックアップファイルをWordPressのDBへインポート

これすごい!ちゃんとインポートされる。すごく気持ちがいいw

4. WordPressに入れたデータをmysqldumpする。(CREATE文が入っているもの)

5. Djangoでプロジェクトを作成(今回は仮でweblogとする。)

6. アプリケーションを作成(今回は仮でblogとする。)

この後、
django-wordpress-admin-read-only/wordpress/以下をモデルの下へコピーし、
settings.pyINSTALLED_APPSに「6」で追加したアプリケーションblogを追加。
他にもadminなんかも追加しておくので、
settyngs.pyINSTALLED_APPSは下記のようになる。

INSTALLED_APPS = (
 ’django.contrib.auth’,
 ’django.contrib.contenttypes’,
 ’django.contrib.sessions’,
 ’django.contrib.sites’,
 ’django.contrib.markup’,
 ’django.contrib.admin’,
 ’weblog.blog’,
)

それからsyncdbを叩くと、DBがちゃんと作成されない。。。。。

./manage.py sql blog

で確認してもちゃんとCreateTableしているのに。。。

で何が足りないか?

・ テーブル(wp_post2cat)
・ wp_postsテーブルのカラム(comment_status)
・ wp_postsテーブルのカラム(ping_status)
・ wp_postsテーブルのカラム(post_status)
・ wp_postsテーブルのカラム(post_password)

これが足りないorz

なので、

INSTALLED_APPSへはアプリを追加せずに実行する。

7. 「6」で追加したアプリケーションをコメントアウト

INSTALLED_APPS = (
 ’django.contrib.auth’,
 ’django.contrib.contenttypes’,
 ’django.contrib.sessions’,
 ’django.contrib.sites’,
 ’django.contrib.markup’,
 ’django.contrib.admin’,
# ’weblog.blog’,
)

8. 先ほどsyncdbをしたので、一度DBをドロップしてから再作成。

9. mysqldumpをDBへ流し込む。
※ CREATE文が入っているものであれば、models.pyと同期が取れるので。

10. 「7」でコメントアウトしたアプリケーションのコメントアウトを外す。

11. django-wordpress-admin-read-only/readme.txtに書いてある通りにテーブル名を変更する。

ALTER TABLE `blog`.`wp_post2cat` RENAME TO `blog`.`wp_posts_categories`;

ALTER TABLE `blog`.`wp_link2cat` RENAME TO `blog`.`wp_links_categories`;

12. models.pyも11に伴い変更する。

47行目

categories = models.ManyToManyField(Category, db_table=u’%swp_link2cat’ % WP_PREFIX, filter_interface=models.HORIZONTAL)

を下記に変更する。

categories = models.ManyToManyField(Category, db_table=u’%slinks_categories’ % WP_PREFIX, filter_interface=models.HORIZONTAL)

122行目

categories = models.ManyToManyField(Category, db_table=u’%swp_post2cat’ % WP_PREFIX, filter_interface=models.HORIZONTAL)

を下記に変更する。

categories = models.ManyToManyField(Category, db_table=u’%sposts_categories’ % WP_PREFIX, filter_interface=models.HORIZONTAL)

これでadminへログインしてデータを確認する。

ちゃんと管理側でも確認出来た♪

後はviews.pyやテンプレートを作成すればOK.

でもWordPressをそのまま使えばって思うが、

Djangoで作ってみたい!!!ので作成する事に決定w

Pythonを勉強中 vol.3

一日一つやっていこうと思っている、

Python」の勉強のvol.3

今日は、

for」を使って遊んでみる。

実際にどんな動きをするかを確認すると、

おもしろいなぁ~。

>>> x = [‘dog’, ‘cat’, ‘lion’]
>>> y = [‘cow’, ‘pig’, ‘elephant’]
>>> for i in x:
…   i + ‘.jpg’
…  
…  
‘dog.jpg’
‘cat.jpg’
‘lion.jpg’

こんな感じでやってみた。
次に連想配列的なものをやってみる。

>>> k = {}
>>> for i in range(len(x)):
…    for j in range(len(y)):
…     if (i == j):
…      k[i] = x[i], y[j]


>>> k
{0: (‘dog’, ‘cow’), 1: (‘cat’, ‘pig’), 2: (‘lion’, ‘elephant’)}

for i in range(len(x)):よりもfor i, j in enumerate(x):

って書いたほうがオシャレらしい。

実際にやってみた。

>>> h = {}
>>> for i, j in enumerate(x):
…     for k, l in enumerate(y):
…      if i == k:
…       h[i] = j, l


>>> h
{0: (‘dog’, ‘cow’), 1: (‘cat’, ‘pig’), 2: (‘hige’, ‘hoge’)}

おもしろい、おもしろい。

このままやればソースも読めるようになるだろう。

みんなのPython
ソフトバンククリエイティブ(2006-08-22)

  • (著)柴田 淳

ソフトバンククリエイティブ
新品価格:¥ 2,940
中古価格:¥ 1,800
ASIN:479733665X

Pythonを勉強中 vol.2

今日は、

PHPには無い「lambda」を使ってみた。

これはおもしろい。

lambda 引数のリスト : 引数を使った式

がlambdaの書式。

※サンプルのコードは「みんなのPython」から抜粋

実際に試すにあたって、

lambdaを使わない場合が下記

>>> def cmp_len(a, b):
…  return cmp(len(a), len(b))

>>> l = [“123”, “12345”, “12”]
>>> l.sort(cmp_len)
>>> l
[’12’, ‘123’, ‘12345’]

ちゃんとソートされている。

次にlambdaを使ってみる。

>>> l = [“123”, “12345”, “12”]
>>> l.sort(lambda a, b : cmp(a, b))
>>> l
[’12’, ‘123’, ‘12345’]

すげぇ〜1行で書ける。

みんなのPythonには下記の事が書かれていた。

便利だが可読性が悪い

ふむふむ。

ソートのように関数名を添える処理で利用し、
プログラムを簡潔に表記する目的で使われる。

なるほどね。

でもこれ使えたらかなり便利だと思うなぁ〜。

ちなみに今回使った関数で「cmp」というのがある。

これは、

第1引数と第2引数を比較する関数。

第1引数が小さい場合は、「-1」を返す。

両方の引数が等しい場合は「0」を返す。

第1引数の方が大きい場合は、「1」を返す。

ってかあらゆるオブジェクトが比較出来るみたい。

これもいいなぁ〜。

これは初めてのPythonに記述されていたっす。

やってみた。

>>> x = “dog”
>>> y = “lion”
>>> z = “cat”
>>> cmp(x, y)
-1
>>> cmp(y, x)
1
>>> cmp(x, z)
1
>>> cmp(len(x), len(z))
0

こんな感じ。

なるほど。

みんなのPython
ソフトバンククリエイティブ(2006-08-22)

  • (著)柴田 淳

ソフトバンククリエイティブ
新品価格:¥ 2,940
中古価格:¥ 1,800
ASIN:479733665X

Safari パブリックベータをwindowsへインストール

最近はほぼMacしか使っていなかったので、

たまにはWindowsでイロイロいじってみた。

で、

ふと思い出した。

そういえばWindows版のSafariってどうなってるのかな?

appleのサイトに入ってみた。

あれ?

Http/1.1 Service Unavailable

ん?

なんでだろ?

とりあえずGoogleさんで調べてみたら、

同じ現象の人が結構いるんだね。

とりあえずは、

appleのサイトをIP直打ちでアクセスした。

表示されたので、

ダウンロードしてインストールしてみた。

メニューはまだ日本語されていないが、

以前は日本語のサイト自体が表示されていなかったのが、

修正されているw

自分のブログもアクセスしてみたところ問題なく表示されていますね。

速度もFireFoxやIEと比べると断然に速いなぁ~!!!

これからはWindowsでもSafari使おうかなぁ~。

Djangoのセレクトボックスのプルダウンから「———」を無くす

Djangoでコメントフォームを作りたく、

その中にセレクトボックスがあるのですが、

newformsでセレクトボックスを生成した場合、

デフォルトで「———」が入ってしまって

参ってました。

その理由として

・セレクトボックスは必ず選択されていたい.
・選択されていないとエラーが出てしまう.

なので、

以前Python温泉でnobuさんから

newformsに関してレクチャーを受けて、

習った事をwikiにまとめたっす。

これはすごぉ〜い勉強になりました。

追記

でもr6733からは、

対応しなくて良くなったみたいw

def formfield(self, form_class=forms.CharField, **kwargs):
“Returns a django.newforms.Field instance for this database Field.”
defaults = {‘required’: not self.blank, ‘label’: capfirst(self.verbose_name), ‘help_text’: self.help_text}
if self.choices:
defaults[‘widget’] = forms.Select(choices=self.get_choices(include_blank=self.blank or not (self.has_default() or ‘initial’ in kwargs)))
if self.has_default():
defaults[‘initial’] = self.get_default()
defaults.update(kwargs)
return form_class(**defaults)