4

Django1.2管理者でこのエラーが発生しています。

シナリオ:

私には2つのアプリケーションがあります。たとえばapp1app2プロジェクト内です。これらのアプリの両方で、それぞれのadmin.pyファイルを定義して、各アプリのそれぞれのモデルをdjangoの管理サイトにフックしました。

admin.py内app1で、app1の3つのモデルクラスに対応する3つのModelAdminクラスを定義し、そのうちの2つを管理サイトに登録しました。

class App11stModelAdmin (admin.ModelAdmin):
    #class definitions here

    #This class is an abstract class
    #class Meta:
    #   abstract = True

class App12ndModelAdmin (admin.ModelAdmin):
    #class definitions here

class App13rdModelAdmin (admin.ModelAdmin):
    #class definitions here

#register to admin site two of them
admin.site.register(App12ndModel, App12ndModelAdmin)
admin.site.register(App13rdModel, App13rdModelAdmin)

内部では、モデルの管理モデルを定義するためapp2にインポートしました。app1.App11stModelAdminapp2

のadmin.py内app2

from app1.admin import App11stModelAdmin

class App21stModelAdmin(App11stModelAdmin):
    #define some things here

#register App21stModelAdmin to admin site
admin.site.register(App21stModel, App21stModelAdmin)

このコードでは、次のエラーメッセージが表示されます。

AlreadyRegistered at /admin/

The model App12ndModel is already registered

Request Method:     GET
Request URL:    http://127.0.0.1:8000/admin/
Django Version:     1.2
Exception Type:     AlreadyRegistered
Exception Value:    

The model App12ndModel is already registered

そのモデルの管理者を一度だけ登録していると確信しているので、これは奇妙です。そのモデルのregisterステートメントをコメントアウトすると、同じエラーが発生しましたが、モデルの場合はエラーになりますApp13rdModel

それまでの間、この問題を修正するために、登録届出書を削除し、代わりにapp1admin.py内の「static」関数内に配置しました。

のように:app1admin.py内

def register():
    admin.site.register(App12ndModel, App12ndModelAdmin)
    admin.site.register(App13rdModel, App13rdModelAdmin)

次にapp2admin.pyで

インポートに登録機能を含めました:

from app1.model import App11stModelAdmin, register

 ......
 ......
#register the two admin model in app1 inside app2 admin.py by calling the register function
register()

そして、これは機能します。すでに登録済みのエラーが発生しなくなりました。

質問:

そのエラーの原因となった私は何をしましたか?私はDjangoとPythonを初めて使用します。

どうもありがとうございます!

4

2 に答える 2

5

admin.pyadmin.pyファイルは実行時に Django によって実行されるため、スクリプトを別のスクリプトにインポートすると、公開されたadmin.site.register関数を実際に再度実行することになり、Already Registeredエラーが発生します。

これは、実際には標準的な Python の動作です。次のスクリプトを検討してください (名前を付けて保存sample.py):

def multiplier(x,y):
    return x*y

def sample_write(text):
    out = open("out.txt","w")
    out.write(text)
    out.close()

sample_write("hey") # Notice this executed function

同じディレクトリで Python インタープリターを開いて実行import sampleすると、出力が書き込まれout.txtます。multiplierのように関数を選択的にインポートする場合と同じ場合from sample import multiplier、出力ファイルは引き続き書き込まれます。出力ファイルが書き込まれないようにする唯一の方法は、スクリプトで実行された関数をコメントアウトするか、別の関数にラップすることです。

于 2012-06-11T21:52:42.090 に答える
3

これを引き起こす可能性がある唯一のことは、admin.py が 2 つの異なる方法でインポートされている場合です。たとえば、次は 2 つの異なるモジュールと見なされ、実際には admin.py コードが 2 回実行されます。

from foo.admin import FooAdmin
from myproject.foo.admin import FooAdmin
于 2012-06-11T21:24:34.520 に答える