django.contrib.auth.models.User の拡張について

487 views
Skip to first unread message

岩下洋治

unread,
Aug 3, 2009, 4:48:13 AM8/3/09
to django-ja
岩下と申します。

auth.models.User を拡張したい(ユーザーのパラメータを増やしたい)場合、

1) プロフィールモデルを定義して使う (User.get_profile() が使える状態にする)
2) auth.models.User を継承する

の2つの方法があるかと思いますが、どちらの方法を使うべきなのか、悩んでます。
自分ではどう考えても答えが出ないので、皆さんにお尋ねしたいと思います。

今分かっていることを書き連ねてみます。

・django1.0以前は、そもそもモデルの継承が出来なかったので、1) しか選択肢がなかった
・1.0 のドキュメントでも 1) の方法しか書いてないので、2) は推奨されてないのかもしれない
・しかし、露木さんの「Django×Python」114ページでは 2) の方法を使っている
・試しに 2) にしてみたところ、adminのページ内では
auth.models.User と継承したモデルは別個に表示される (継承したモデル側にもUserの内容が表示される)
継承モデルデータではパスワード変更フォームへのリンクがリンクエラーになる
・2) の場合、http://d.hatena.ne.jp/fgshun/20090610/1244598810
このwebで指摘されているとおり、objectsマネージャー、create_user() がない。

以上のような状態です。
2) にしたときの細かい問題を、ちゃっちゃと直せるぐらいになればこんな事で悩むことは
無いのだろうと思いますが、現状は悩みまくりです。
よろしくお願いします。

re_guzy

unread,
Aug 3, 2009, 8:17:47 PM8/3/09
to django-ja
上谷と申します。(Blog: http://d.hatena.ne.jp/re_guzy/)

> 1) プロフィールモデルを定義して使う (User.get_profile() が使える状態にする)
> 2) auth.models.User を継承する
1.0からはマルチテーブル継承が使えるので、あえてUser.get_profile()を使わなくてもいいんじゃないかと。

> 2) にしたときの細かい問題を、ちゃっちゃと直せるぐらいになればこんな事で悩むことは
> 無いのだろうと思いますが、現状は悩みまくりです。
昔自分もいろいろ試行錯誤したので、その時やったことを書いてみます。
Userを継承しただけでは不十分で、UserChangeForm・UserCreationForm・UserAdminも継承しないと
意図したようには動きません。

以下のコードで上記の問題はクリアできたはず。
あと、UserCustomだけ表示してUserを表示したくない場合、
admin.site.unregister(User)
ってやれば管理サイトでも表示されません。

#models.py
from django.contrib.auth import models as auth_models
from django.db import models

class UserCustom(auth_models.User):
objects = auth_models.UserManager()

#forms.py
from django.contrib.auth import forms as auth_forms
import models as my_models

class UserCustomChangeForm(auth_forms.UserChangeForm):
class Meta:
model = my_models.UserCustom

class UserCustomCreationForm(auth_forms.UserCreationForm):
class Meta:
model = my_models.UserCustom

#admin.py
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
import models as my_models
import forms as my_forms

class UserCustomAdmin(UserAdmin):
add_form = my_forms.UserCustomCreationForm
form = my_forms.UserCustomChangeForm
model = my_models.UserCustom

岩下洋治

unread,
Aug 5, 2009, 12:40:14 AM8/5/09
to django-ja
岩下です。

ありがとうございます。いただいた情報を参考にやってみます。
出来たら報告します。

Morimoto Tetsuya

unread,
Aug 30, 2009, 7:29:23 AM8/30/09
to djan...@googlegroups.com
上谷さん

もりもとです。

私もユーザマスタの拡張を行っていたところで、
とても参考にさせて頂きました。
ありがとうございます。

私の環境は、django-1.1 なのですが、
django-1.1 では、さらに追加設定が必要なようです。
念のため、ご連絡しておきます。

UserCreationForm を継承したフォームで、
fields に username を追加しないと、
オリジナルの User(auth_user) に登録されないようです。

誤:
> class UserCustomCreationForm(auth_forms.UserCreationForm):
> class Meta:
> model = my_models.UserCustom

正:
class UserCustomCreationForm(auth_forms.UserCreationForm):
class Meta:
model = my_models.UserCustom
fields = ('username',)

取り急ぎ、ご連絡まで。

2009/08/04 9:17 に re_guzy<toru....@gmail.com> さんは書きました:
Reply all
Reply to author
Forward
0 new messages