DjangoのUserモデルを拡張する

現在このブログは中途半端に移行されていますので、画像が表示されなかったり、レイアウトが崩れたりする可能性があります。
この記事を旧ブログで閲覧するには、以下のURLからご覧ください。
http://blog2.monospace.jp/2006/08/01/django-extending-usermodel/

前回、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/

TrackBacks

まだ登録されていません。

Comments

まだ登録されていません。

Add Comment

Add Comment