2017-02-21 10 views
1

簡単にプラグインできるように設計されたdjangoアプリを作成しました。これは、1つのビューしか持たず、アプリケーションを使用するプロジェクトの計画が気にする必要があります。モジュールレベルでDjangoアプリのモデルを公開する

簡単に、私はビューとモデルをアプリレベルから利用できるようにしたいと考えています。そうではなく:

from mything.views import MyView 
from mything.models import MyModel 

あなただけではなく、行うことができます。

from mything import MyView, MyModel 

を私はこのようなことをアプリで__init__.pyファイルを変更:もちろん

from .views import MyView 
from .models import MyModel 

を私は古いを取得しますdjango.core.exceptions.AppRegistryNotReadyは、アプリが読み込まれる前にmodels.pyコードを実行しようとしているため発生しました。

私は次の回避策を考え出しました。使用するかどうかは妥当なパターンかどうかと思います。今__init__.pyに私が持っている:

def _expose_items(): 
    from .views import MyView 
    from .models import MyModel 
    globals()['MyView'] = MyView 
    globals()['MyModel'] = MyModel 

そして、私のアプリのapps.py中:

from . import _expose_items 

class MyThingConfig(AppConfig): 
    name = 'mything' 

    def ready(self): 
     _expose_items() 

だから今確かに、私が直接外部からのビューとモデルをインポートすることができます。これは役に立ちますか、恐ろしいですか?

+2

それはsthを達成するためにkung-fuの多くのようである。ほとんどのdjango開発者は機能を考慮しませんでした。すべてのdjangoアプリケーションに 'views'と' models'があります。そこから名前をインポートすると意味的にマークされます。 [zen of python](https://www.python.org/dev/peps/pep-0020/)と暗黙の明快さのための呼び出しもそれを気に入らない;) – schwobaseggl

答えて

0

ほとんどのDjangoアプリケーションは、トップレベルモジュールにビューやモデルを収集しません。例としてdjango.contrib.authを参照してください。

0

ほとんどのDjangoアプリケーションは、トップレベルモジュールにビューやモデルを収集しません。明確なドキュメントを使用して、アプリからインポートする方法をデモンストレーションしてください。 globals()を含むハックは、おそらくヘルプよりも多くの問題を引き起こすでしょう。

例としてdjango.contrib.authを参照してください。

関連する問題