已在/admin/Django 1.2注册错误

已在/admin/Django 1.2注册错误,django,django-admin,Django,Django Admin,我在Django 1.2 admin中遇到此错误 情景: 我的项目中有两个应用程序,比如app1和app2。 在这两个应用程序中,我定义了各自的admin.py文件,将每个应用程序各自的模型连接到django的管理站点 在app1admin.py中,我定义了三个ModelAdmin类,对应于app1中的三个Model类,并将其中两个注册到管理站点 class App11stModelAdmin (admin.ModelAdmin): #class definitions here

我在Django 1.2 admin中遇到此错误

情景:

我的项目中有两个应用程序,比如
app1
app2
。 在这两个应用程序中,我定义了各自的
admin.py
文件,将每个应用程序各自的模型连接到django的管理站点

app1
admin.py中,我定义了三个ModelAdmin类,对应于app1中的三个Model类,并将其中两个注册到管理站点

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.App11stModelAdmin
来定义
app2
模型的管理模型

app2的内部admin.py

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
model

同时,为了解决这个问题,我删除了注册语句,而是将它们放在
app1
admin.py中的“静态”函数中

比如: 内部app1 admin.py

def register():
    admin.site.register(App12ndModel, App12ndModelAdmin)
    admin.site.register(App13rdModel, App13rdModelAdmin)
然后在app2 admin.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


多谢各位

导致这种情况的唯一原因是您的admin.py以两种不同的方式导入。例如,以下被视为两个不同的模块,实际上会导致admin.py代码运行两次:

from foo.admin import FooAdmin
from myproject.foo.admin import FooAdmin

Django在运行时执行
admin.py
文件,因此,如果将
admin.py
脚本导入到另一个脚本中,则实际上是再次执行公开的
admin.site.register
函数,从而出现
已注册的
错误

这实际上是标准的Python行为。考虑下面的脚本(保存为<代码> St.Py < /代码>):


当您在同一目录中打开Python解释器并执行
import sample
时,它将写入
out.txt
输出。与从示例导入乘数
中有选择地导入
乘数
函数(如
)时的情况相同,输出文件仍被写入。避免写入输出文件的唯一方法是注释掉脚本中已执行的函数或将其包装到另一个函数中。

只是观察一下(我认为这没有帮助,但无论如何):class
ModelAdmin
没有
Meta
属性,您可以删除它。它属于
模型
类。还有-有什么原因,为什么你在app1中定义了
App11stModelAdmin
,而你只在app2中使用它?我只是说,我为什么把这些模型/管理员模型放在它们各自的应用程序中是有原因的。。。不管怎样,好吧,这就解释了。导入管理文件会在文件中执行“已可执行”语句。所以,我为这个问题选择的走走方式就像你建议的那样。但我觉得有更好的办法。谢谢这是真是假
admin.py
是在运行
admin.autodiscover()
时导入的,因此OP的导入计数为秒,但它并没有那么简单。Python足够聪明,不会多次导入同一个模块(但它必须是完全相同的模块、导入路径和所有内容)。事实上,我从我的一个应用程序的admin.py导入了许多其他应用程序的admin.py文件,但没有得到这个错误。在我的例子中,我认为情况并非如此,正如您可以从我给出的示例代码中验证的那样。tnx!
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