ユーザ情報の拡張 ni

62 views
Skip to first unread message

Sumiya Sakoda

unread,
Jun 22, 2007, 3:06:24 AM6/22/07
to django-ja
佐古田です。
本家のMLアーカイブも見たのですがどうやってもわからないので教えてください。
バージョンはDjango-0.96 + Python2.4.4です。

やったこと
1. *既存の*アプリケーションblogのviews.pyに以下を追加

Sumiya Sakoda

unread,
Jun 22, 2007, 3:14:22 AM6/22/07
to django-ja
すいません。とちゅうでわけもかわらず送信してしまいました。
ユーザ情報の拡張について教えてください。

やったこと
1. *既存の*アプリケーションblogのviews.pyに以下を追加
from django.contrib.auth.models import User

class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
code = models.TextField(blank=True, null=True, default='123')

2. settings.pyに以下を追加
AUTH_PROFILE_MODULE = 'blog.UserProfile'

3. python manage.py syncdbの実行
データベース内にblog_userprofileというテーブルができます。

これで新規ユーザには拡張情報を格納できるとおもっているのですがうまくいきません。
model._default_manager.get(user__id__exact=self.id)がNoneを返すみたいです。
django/contrib/auth/models.pyのget_profileメソッドを見てみるとこのテーブルから得られた情報を返すようで
すがどのタイミングでここに保存のかがわかりません。

よろしくお願いします。

Yasushi Masuda

unread,
Jun 22, 2007, 3:19:36 AM6/22/07
to djan...@googlegroups.com
佐古田さん、

今ひとつ質問を理解できていないのですが、

UserProfile.objects.get(user=User.objects.get(照合条件))

に近いことを実現されたいということでしょうか?


Sumiya Sakoda さんは書きました:


--
Yasushi Masuda
http://ymasuda.jp/

Sumiya Sakoda

unread,
Jun 22, 2007, 3:45:09 AM6/22/07
to django-ja
On 6月22日, 午後4:19, Yasushi Masuda <ymas...@ethercube.com> wrote:

> 今ひとつ質問を理解できていないのですが、
>
> UserProfile.objects.get(user=User.objects.get(照合条件))
>
> に近いことを実現されたいということでしょうか?

すいません。誤送信したのであわてて書いて伝わりにくかったかもしれないです。
ずばり以下のことをやりたいのです。

http://www.b-list.org/weblog/2006/06/06/django-tips-extending-user-model

下のほうにあるサンプル

from django.contrib.auth.models import User
u = User.objects.get(pk=1) # Get the first user in the system
user_address = u.get_profile().home_address

のようなことをやろうとしてもget_profileを呼び出したところでDeseNotExceptionを返すのです。
つまりこの例でいうならば既に拡張モデルにデータが入ってなければなりませんよね。

てっきり私はこんなふうにやると

$ python manage.py shell
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(pk=1)
>>> user = User.objects.create_user(username='john', email='jle...@beatles.com', password='glass onion')
>>> user.home_address = 'http://beatles.com/~john'
>>> user.save()

settings.AUTH_PROFILE_MODULEの値から関連するmodelを探して値を代入してくれるのかなと思ってました。

でも、ひょっとしてこれはDjangoが勝手に面倒を見てくれるのではなく自分で別プロセスで実装しなければならないんでしょうか。
いやそんな気がしてきた。それだったらそれでいいです。

Sumiya Sakoda

unread,
Jun 22, 2007, 3:56:06 AM6/22/07
to django-ja
まちがいだらけでした。

「1. *既存の*アプリケーションblogのviews.pyに以下を追加」ではなく
「1. *既存の*アプリケーションblogのmodels.pyに以下を追加 」です。これが話をややこしくしたかもです。

あと先ほどのメールでの以下はいりません。コピーミスです。
>>> u = User.objects.get(pk=1)

Makoto Uemura

unread,
Jun 22, 2007, 5:08:29 AM6/22/07
to djan...@googlegroups.com
上村です。

最初にプロファイルのオブジェクトを作ってからじゃないと
u = User.objects.get(pk=1)
で作ったインスタンスでget_profile()はできないと思います。

07/06/22 に Sumiya Sakoda<hige...@gmail.com> さんは書きました:

Sumiya Sakoda

unread,
Jun 22, 2007, 5:25:15 AM6/22/07
to django-ja
On 6月22日, 午後6:08, "Makoto Uemura" <makoto.uem...@gmail.com> wrote:
> 上村です。
>
> 最初にプロファイルのオブジェクトを作ってからじゃないと
> u = User.objects.get(pk=1)
> で作ったインスタンスでget_profile()はできないと思います。

ありがとうございます。理解しました。

# blog.models.py


class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)

code = models.CharField("コード", maxlength=10, blank=True,
null=True)

# settings.py内
AUTH_PROFILE_MODULE = 'blog.UserProfile'

# シェルモードでの拡張データの登録


$ python manage.py shell
>>> from django.contrib.auth.models import User

>>> from blog.models import UserProfile
>>> u = User.objects.get(pk=1)
>>> p = UserProfile(user=u, code='3456')
>>> p.save()
>>> u.get_profile().code
でできました。

Reply all
Reply to author
Forward
0 new messages