Archive@2006/08

DjangoのGenericViews(汎用ビュー)object_listでページ分割をする

久々の更新になってしまいました。最近ちょっと多忙です。 でも実はDjangoを実践投入できる仕事をもらったので、結構楽しんでます。 今日ちょっとやろうとしたことが解決できたので紹介しておきます。 GenericViewsのobject_listは、簡単にページ分割が実現できるようになってます。 ただ、↓こんな感じのものができなくて困ってました。 前へ 1 2 3 4 5 6 次へ 要するに、全ページへのリンクをはさみたかったんですよね。 はまったのが、ページ分割オプションで使えるようになるpagesという変数がintなので、 これを、range(pages)みたいにしてリストにしたいのですが、Djangoのテンプレート内では これができません。Google GroupのDjango usersを調べてたら発見しました。 Pagination - displaying page numbers rangeを使えるようにするパッチ作ってる人がいるからそれを使うか、 テンプレート内で変数をキャプチャできるものがあるからそれを使うかって感じでした。 パッチ使った方が手軽そうだったんで、そっちでやってみました。 デフォルトフィルターにrange0とrange1を追加するパッチ http://code.djangoproject.com/ticket/1162 range0は0からインデックスを作るもので、range1は1からですね。
{% if has_previous %}前のページへ{% endif %} {% for page_number in pages|range1 %} {% ifnotequal page_number page %} {{ page_num }} {% else %} {{ page_number }} {% endifnotequal %} {% endfor %} {% if has_next %}次のページへ{% endif %}
現在表示中のページはリンクしないようにしたりしてみました。 Djangoバンザイ!
Posted at: 
2006/08/25 04:36:27
0 Comments
0 TrackBacks
Tags: 
Trackback: 
http://blog.monospace.jp/2006/08/25/django-tips-20060825/trackback/

DjangoのUserモデルを拡張する

前回、Djangoの認証機能を使って簡単なログイン・ログアウトを実装しました。 Djangoの認証機能は非常によくできているので、使わない手はないです。 現在、Userモデル(django.contrib.auth.model.py)に実装されているUserクラスは、 ユーザ名、名字、名前、メールアドレス、パスワード、最終ログインなどなどですが、 プロフィール的なもの(性別、生年月日、住所など)を持たせたい場合は、 どうしたらいいものかと調べていたら、そのままのサイトがありました。 The B-List: Django tips: extending the User model リレーションを作るのがいいという話になっていて、この記事を書いた人は、 OneToOneFieldを使うと言ってるんですが、 コメントで、OneToOneFieldは今推奨されてない(今後変わる予定)から ForeignKeyでも同じようにできるよってことになってたりしました。 個人的にもForeignKeyで実装しておいた方がよいかなー と思ったのでそっちにしてみました。 [python]#vim: fileencoding=utf-8 #model.py from django.db import models from django.contrib.auth.models import User #Userクラスをインポート #住所の選択項目 ADDRESS = ( (’Aichi’, ‘愛知’), (’Tokyo’, ‘東京’), ) class Profile(models.Model): user = models.ForeignKey(User, unique=True, edit_inline=models.STACKED, num_in_admin=1, min_num_in_admin=1, max_num_in_admin=1, num_extra_on_change=0) #Userクラスに対するリレーション address = models.CharField(maxlength=10, choices=ADDRESS, core=True) birthday = models.DateField() def __str__(self): return self.user.username[/python] 超シンプルなProfileクラスです。住所と生年月日をUserクラスにくっつけてます。 class Adminを使わないのは、User側の管理画面でプロフィールの編集をするためで、 edit_inline=models.STACKEDを使ってます。追加や編集の際に余分なフィールドが 表示されないように、オプションがいっぱいついてます。 [追記:2007/12/12 03:32] core=Trueではまりました。 edit_inlineをつかった場合、他のフィールド(この場合addressとか)にcore=Trueを つけないと保存したときにProfileクラス側のデータを削除したりします。 0.95ではエラーが出てたんですが、いつから出なくなったのかな [/追記] さらに、AUTH_PROFILE_MODULE = ‘profile.Profile’ #app名.クラス名を、 setting.pyに書くと以下のようなことができるようになります。 [python]from django.contrib.auth.models import User u = User.objects.get(pk=1) u.username #hfunaiを出力 u.email #hfunai[at]monospace.jpを出力 u.get_profile().address #Aichiを出力 u.get_profile().birthday #datetime.date(1979, 3, 30)を出力[/python] get_profile()というメソッドを使えば、さっき作ったProfileクラスをimportしなくても Userクラスから呼び出せます。これは何かと便利ですね。
Posted at: 
2006/08/01 02:40:53
0 Comments
0 TrackBacks
Tags: 
Trackback: 
http://blog.monospace.jp/2006/08/01/django-extending-usermodel/trackback/