我在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
这很奇怪,因为我'm sure I'只注册该模型的管理员一次 . 当我注释掉该模型的寄存器语句时,我得到了相同的错误,但现在是 App13rdModel
模型 .
在此期间,为了解决这个问题,我删除了注册语句,而是将它们放在 app1
admin.py中的'static'函数中 .
喜欢:里面的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()
这很有效 . 我不再收到已经注册的错误 .
Question:
我做了什么导致了这个错误?我是Django和Python的新手 .
非常感谢你!
2 回答
Django在运行时执行
admin.py
文件,因此如果将admin.py
脚本导入另一个脚本,则实际上是再次执行公开的admin.site.register
函数,从而导致Already Registered
错误 .这实际上是标准的Python行为 . 请考虑以下脚本(另存为
sample.py
):当您在同一目录中打开Python解释器并执行
import sample
时,它将写入out.txt
输出 . 当您有选择地导入multiplier
函数(如from sample import multiplier
)时,输出文件仍然被写入 . 避免写入输出文件的唯一方法是在脚本中注释掉执行的函数或将其包装到另一个函数中 .唯一可能导致这种情况的是,如果您的admin.py以两种不同的方式导入 . 例如,以下内容被视为两个不同的模块,实际上会导致admin.py代码运行两次: