我在Django 1.2管理员中遇到此错误。
情景:
我有两个应用程序,比如我的项目中的app1
和app2
。
在这两个应用程序中,我定义了各自的admin.py
文件,以将每个应用程序各自的模型挂钩到django的管理站点。
在app1
admin.py中,我定义了三个与app1中的三个模型类相对应的ModelAdmin类,并将其中两个注册到了管理站点。
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
这很奇怪,因为我确信我只会注册该模型的管理员一次。当我注释掉该模型的寄存器语句时,我得到了同样的错误,但现在是App13rdModel
模型。
与此同时,为了解决这个问题,我删除了注册语句,而是将它们放在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的新手。
非常感谢!
答案 0 :(得分:5)
admin.py
文件在运行时由Django执行,因此如果您将admin.py
脚本导入另一个脚本,您实际上是再次执行公开的admin.site.register
函数,从而为您提供{ {1}}错误。
这实际上是标准的Python行为。请考虑以下脚本(另存为Already Registered
):
sample.py
当您在同一目录中打开Python解释器并执行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
时,它将写入import sample
输出。当您有选择地导入out.txt
函数(例如multiplier
)时,仍会写入输出文件。避免写入输出文件的唯一方法是在脚本中注释掉执行的函数或将其包装到另一个函数中。
答案 1 :(得分:3)
唯一可能导致此问题的是,您的admin.py是以两种不同的方式导入的。例如,以下内容被视为两个不同的模块,实际上会导致admin.py代码运行两次:
from foo.admin import FooAdmin
from myproject.foo.admin import FooAdmin