2

さまざまな複雑な理由から [1]、Django User クラスに追加のプロパティを追加する必要があります。

これを行うには、プロファイルも「継承」方法も使用できません。( Django でカスタム フィールドを使用して User モデルを拡張するのと同様)

だから私がやっていることは、私の local_settings ファイルに User クラスを含めることです。そこにプロパティを追加します。

おそらく驚くべきことに、これは多くの場合に機能するようです。しかし、UserManager.create_user() から新しいユーザーを作成するときではありません。したがって、 UserManager.create_user() メソッドの代わりにパッチを当てる必要があります。このソース (contrib.auth.models.py 内) を見ると、ユーザーを作成するために使用するクラスが、直接参照されるのではなく、UserManager.model というプロパティに保持されていることがわかります。

行はこれです:

user = self.model(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now)

問題は、この self.model (User クラスへの参照が含まれていると思われます) が、パッチを適用したバージョンではないように見えることです。

それで、UserManagerの場合、このself.modelがどこに設定されているか知っている人はいますか? そして、その時点でコードが local_settings を通過していないため、 User クラスへのパッチが存在しないと仮定するのは正しいでしょうか? そして、クラスにパッチを当てるためのより良い場所があれば?

乾杯

フィル

【1】好奇心を満たす。User クラスがデータベース内の別の既存のテーブルを使用するようにする必要があります。これには、追加のフィールドと制約があります。

更新:将来の参考のために、プロキシモデルは、Djangoが私が必要とするものをサポートする方法であるようです:http://code.djangoproject.com/ticket/10356

4

3 に答える 3

2

サイト固有のユーザーフィールドを持つ通常の方法は、settings.pyでユーザープロファイルテーブルを指定することです。その後、u.user_profile()メソッドを介して特定の設定を取得できます。それはドキュメントに非常によく文書化されています。

于 2009-06-08T12:13:04.480 に答える
2

Django 1.1 ベータ版があなたにとってあまり最先端ではない場合は、プロキシ モデルを試してください。

于 2009-06-08T20:23:34.237 に答える
2

おそらく、できるだけ早く (認証アプリケーションが実際にインストールされる前に) 置換/追加/モンキー パッチを確実に実行する必要があるだけです。ただし、問題は、モデル クラスがいくつかのメタクラス処理を実行することであり、おそらく UserManager のクラスが間違っている理由を説明するものです。元のクラスを生成し、そのクラスで UserManager をセットアップしてから、自分の処理を実行します。そして物事は同じではありません。

つまり、クラスを置き換えるときは残忍になります。元のクラスを拡張できる場合は、元のクラスを拡張バージョンに置き換えます。


import django.contrib.auth.models
from django.contrib.auth.models import User as OriginalUser

class User(OriginalUser):
    pass # add your extra fields etc

# then patch the module with your new version
django.contrib.auth.models.User = User

または、それが機能しない場合は、新しいクラスで User クラスを複製してから、パッチを適用します。

それはすべて少し汚いですが、あなたが望むことをするかもしれません。

于 2009-06-08T14:47:17.430 に答える