2010-11-30 16 views
0

私はUserモデルを拡張したいので、いくつかの追加のフィールドと関数を入れることができます(フィールドだけでなく、そうでなければ(私は醜いと思う)get_profile()を使うことができます。Djangoユーザーモデルを拡張する(request.userで機能させる)、Django 1.2.3

また、私はこのように、からrequest.userでその新しい拡張Userモデルを使用したいと思います:

拡張ユーザーモデル:

# imports etc 

class CustomUser(User): 
    extra_field = ... 

    def extra_function(self): 
     ... 

     return ... 

使用例ビュー:

# imports etc 

def extra_function_view(request): 
    print request.user.username 
    print request.user.extra_field 

    request.user.extra_function() 

    return HttpResponse(...) 

上記のコードは、extra_fieldとextra_functionがUserモデルにないため、明らかに機能しません。

これで、認証バックエンドを使用してこれを実現する方法を見つけました。これはちょっと複雑で、Django 1.2.3では動作しませんでした。

AUTHENTICATION_BACKENDS = (
    'myproject.auth_backends.CustomUserModelBackend', 
) 
... 

CUSTOM_USER_MODEL = 'accounts.CustomUser' 

さらに、信号を使用するなど、いくつかの方法が試されましたが、これはうまくいきませんでした。私にとって、唯一の解決策は、Django内のUserモデルを調整するようです(これは、Djangoのソースコードを調整するエレガントなソリューションではありませんが、コードワイズのきれいな解決策です)。

だから私はこれのための解決策を探しています。今

ステファン

答えて

2

あなたは認証バックエンドを調整して正しい軌道に乗っているため

感謝。

認証バックエンドは非常にシンプルにすることができます。ここでは、私たちがプロジェクトで使用しているものを紹介します。

class LocalAccount(object): 
    def authenticate(self, system=None, username=None, password=None): 
     try: 
      user = User.objects.get(system=system, alias=username) 
      if user.check_password(password): 
       return user 
     except User.DoesNotExist: 
      return None 

    def get_user(self, user_id): 
     'returns user' 

    def get_all_permissions(self, user_obj): 
     'returns user permissions' 

    def has_perm(self, user_obj, perm): 
     'verifies permission, remember you can hardcode these' 

    def get_group_permissions(self, user_obj): 
     return set() #We don't use this 

    def has_module_perms(self, user_obj, app_label): 
     return False 

返信するユーザーモデルを返すことができます。あなたのユーザモデルが基本的にDjangoのユーザモデルに似ている限り、あなたはどんな問題にも踏み込まないでしょう。

ユーザーを拡張してアプリケーションを組み込むと、Django Userモデルと独自のUserモデルの両方がモデル継承のデータベースになることにも注意してください。あなたの最善の選択肢は、Django Userモデルをコピーして変更することです。私たちのプロジェクトでは、インストールされたアプリの設定に「認証」を含めていません。

ここのコンセプトはPython duck typingです。あなたが作成するUserモデルがDjangoが探しているのと同じインタフェース(メソッド、フィールド)を持っている限り、それは実際に指定したUserクラスであるかどうかは関係ありません。

+0

私がやったのと似ていますが、私はモデルの継承をしています。 –

+0

完全に理解でき、有効ですが、それでも私は終わりには迷惑をかけました:) – Xealot

+0

今何を言っていますか?オリジナルのDjango Userモデルを編集するための認証バックエンドに行く必要があるのですか?もしそうなら、contrib.authディレクトリを自分のプロジェクトにコピーするだけで十分ですし、Djangoを自分の設定に追加するときに分かりますか? – Boemknaldaarstaatieal

関連する問題