2016-10-05 2 views
1

私は自分のプロジェクトに特有のことをするためにdjango-allauthを拡張しようとしています。私は基本的にdjango-allauthの上に自分自身のラッパーを書こうとしています。インストール、設定、その他のものはallauthと非常によく似ています。Pythonのメタクラスベースとは何ですか?

このため、AppSettingsクラスをallauth/accounts/app_settings.pyから拡張することから始めました。

from allauth.account import app_settings as AllAuthAppSettings 
class MyAppSettings (AllAuthAppSettings): 
    def __init__(self, prefix): 
     # do something 

また、app_settings.pyの終わりに、私は単純に(ジャンゴ-allauth自体からコピー)以下を置く:

import sys 
my_app_settings = MyAppSettings('MY_PREFIX_') 
my_app_settings.__name__ = __name__ 
sys.modules[__name__] = my_app_settings 

私は私自身のapp_settings.pyはこのような何かをした作成しました私は、Python、Djangoの世界に非常に新しいですし、実際にそれらの最後のFOで何が起こっているか理解していない、正直なところ

TypeError: Error when calling the metaclass bases 
    __init__() takes exactly 2 arguments (4 given) 

:私は私のプロジェクトを開始するとき今、それは私に次のエラーを与えますウルライン。

メタクラスベースとはとは何ですか?それに渡されている4つの議論は何ですか?このフローはどのように動作させるのですか?ここで

は、スタックトレースです:あなたは django-allauthパッケージは魔法いくつかの非常に醜いのpythonをやっている AllAuthAppSettings

から継承することができるはずのよう

Unhandled exception in thread started by <function wrapper at 0x104146578> 
Traceback (most recent call last): 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper 
    fn(*args, **kwargs) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run 
    autoreload.raise_last_exception() 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/utils/autoreload.py", line 249, in raise_last_exception 
    six.reraise(*_exception) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper 
    fn(*args, **kwargs) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/__init__.py", line 18, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate 
    app_config.import_models(all_models) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models 
    self.models_module = import_module(models_module_name) 
    File "/Users/user/anaconda/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/Users/user/myproject/my_app/models.py", line 18, in <module> 
    from .model_managers import * 
    File "/Users/user/myproject/my_app/model_managers.py", line 89, in <module> 
    from . import app_settings 
    File "/Users/user/myproject/my_app/app_settings.py", line 9, in <module> 
TypeError: Error when calling the metaclass bases 
    __init__() takes exactly 2 arguments (4 given) 

答えて

1

それは見ていません

import sys # noqa 
app_settings = AppSettings('ACCOUNT_') 
app_settings.__name__ = __name__ 
sys.modules[__name__] = app_settings 

app_settingsモジュールをインポートすると、基本的にAppSettingsクラスのインスタンスr app_settingsモジュールの名前に設定し、次には、インポートされたモジュールをクラスのインスタンスに置き換えます。

クラスインスタンスから継承することはできません。私はあなたが非インスタンス化AppSettingsクラスから継承したいと思っています。これを行うには、あなたは、app_settingsclassから継承する必要はありませapp_settings直接

from allauth.account import app_settings as AllAuthAppSettings 


class MyAppSettings(AllAuthAppSettings.__class__): 
    ... 

私はあなたのクラスにあなたのモジュールをハックするapp_settingsモジュールの端からこれらの行をコピーする必要があるのはないと思います。

+0

返信いただきありがとうございます!私はなぜこれがハックな方法であるかについての部分を得た。しかし、私はまだ上記の変更を行うと同じエラーが発生します。カスタムapp_settings.pyにインスタンス化されていないAppSettingsクラスを取得する方法はありますか? – pymd

+0

このクラスからエラーが発生していますか?あなたは完全なトレースバックを持っています –

+0

私はそう思います。私は完全なスタックトレースを追加しました。 – pymd

関連する問題