やったこと
1. *既存の*アプリケーションblogのviews.pyに以下を追加
やったこと
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メソッドを見てみるとこのテーブルから得られた情報を返すようで
すがどのタイミングでここに保存のかがわかりません。
よろしくお願いします。
今ひとつ質問を理解できていないのですが、
UserProfile.objects.get(user=User.objects.get(照合条件))
に近いことを実現されたいということでしょうか?
Sumiya Sakoda さんは書きました:
--
Yasushi Masuda
http://ymasuda.jp/
> 今ひとつ質問を理解できていないのですが、
>
> 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が勝手に面倒を見てくれるのではなく自分で別プロセスで実装しなければならないんでしょうか。
いやそんな気がしてきた。それだったらそれでいいです。
「1. *既存の*アプリケーションblogのviews.pyに以下を追加」ではなく
「1. *既存の*アプリケーションblogのmodels.pyに以下を追加 」です。これが話をややこしくしたかもです。
あと先ほどのメールでの以下はいりません。コピーミスです。
>>> u = User.objects.get(pk=1)
最初にプロファイルのオブジェクトを作ってからじゃないと
u = User.objects.get(pk=1)
で作ったインスタンスでget_profile()はできないと思います。
07/06/22 に Sumiya Sakoda<hige...@gmail.com> さんは書きました:
ありがとうございます。理解しました。
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
でできました。