Djangoにて社内サイト「エトコトバ」を作ったよ

社内案件で、

それもDjangoで作ったサイトがとうとうオープンしましたよ♪

それがこちら

エトコトバ

これがかなり良い動きを魅せてくれます。

サイトの内容は、

1.言葉もしくは画像を投稿する。
2.誰かの投稿した言葉に紐づく画像を投稿する。
3.誰かの投稿した画像に紐づく言葉を投稿する。
4.どんどんつながっていく。

です。

関わった人たち

ENDLESS
SoundKitchen

おつかれっした!

色々なつながりが見れるようになるサイトだと思いますので、
良かったら是非投稿してみてください。

※PCのみ対応なので、携帯からは無理っす。

pythonを勉強中 vol.8

Pythonをちょこちょこ書いていて、

やっぱDjangoのソースなんかも気になりだした。

vol.8は脱線して、
Djangoのソースを見てみる!

今作っているものでページャーを作りたかったので、
Paginatorを読んでみてみた。

Django/django/core/paginator.py

paginatorに用意されているメソッドは、

・validate_page_number
・get_page
・has_next_page
・has_previous_page
・first_on_page
・last_on_page
・hits
・pages
・page_range

がありました。

実際に使ったのは、

・pages
・has_next_page
・has_previous_page

のみですがw

今回作っているのがブログでして、
pateoさんのブログを見てこれはかっけぇ〜!
って思い、
1カラム、1記事で作ってますw

なので、
1つのページにページャーを

・next(次へ)
・previous(前へ)

的に出したかった。

今回はtemplatetagsを作りたかったので、
下記のように書きました。

#vim: fileencoding=utf-8 :

from urllib import quote
from django import template

register = template.Library()

@register.inclusion_tag(‘test/pagination.html’)
def pagination(paginator, page):
 allpage = paginator.pages

 return {
  ’page’ : page,
  ’allpage’ : allpage,
  ’has_previous’ : paginator.has_previous_page(page),
  ’has_next’ : paginator.has_next_page(page),
  ’next’ : page + 1,
  ’previous’ : page – 1,
 }

まず

allpage = paginator.pages

は実際にページの総数が返ってくる。
次に

paginator.has_previous_page(page)

は引数に現在のページ番号を渡すと
次のページがあるかをチェックするので、
TrueかFalseが返ってくる。

paginator.has_next_page(page)

も同じですね。
これは最初のページの場合は、
next(次へ)は出すが、previous(前へ)は出さないために
使いました。
最後のページの場合は逆ですね。
previous(前へ)は出すが、next(次へ)は出さない。
(実際はリンクのためのパスなんかも取得していて、
それもテンプレートに落とす事で簡単に処理させてます。)

後はテンプレートに落とし込んで終わり。

今回は、
ページのリンクを前後に1つしか出さなかったが、
複数出す場合なんかはすごい便利だなぁ〜と
思いました。
その場合は、

・first_on_page
・last_on_page

を使う事になるだろうなぁ〜。

ソースコードを見ても全然解る範囲だったので、
色々と試してみたいっすね。

サーバーをどうしようか悩み中

とりあえず、

Djangoで作成したサイトを公開したいが、

今レンタルしてるサーバーが

使えるネットのVPS

シルバープランなんです。

こいつのスペックがサイトで確認した所、

OS    Linux
CPU   500MHz
メモリ  128MB
最大メモリ256MB
容量   20GB

なので、

公開してもTracも動かしたいし、

メモリが足らなそうな気がするんだよなぁ〜。

ゴールドとかにするなら、

いっそ自宅サーバーの方がよさげだよなぁ〜。

金が掛かり過ぎる。。。

でも、

子供も居るし以前立てたサーバーは電源抜かれたし。。。

なので、

第1候補としてMacminiを購入して、

それをサーバーにして手の届かない所で運用するのが

よさげ。

そしたら使えるネットが要らなくなりそうだなぁー。

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

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)