已在 /admin/ 处注册 Django 1.2 错误
Posted
技术标签:
【中文标题】已在 /admin/ 处注册 Django 1.2 错误【英文标题】:Already Registered at /admin/ Django 1.2 error 【发布时间】:2012-06-14 17:20:56 【问题描述】:我在 Django 1.2 admin 中遇到此错误。
场景:
我的项目中有两个应用程序,例如 app1
和 app2
。
在这两个应用程序中,我定义了它们各自的 admin.py
文件以将每个应用程序各自的模型挂接到 django 的管理站点。
在app1
admin.py中,我定义了三个ModelAdmin类,对应app1中的三个models类,并将其中两个注册到admin站点。
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 的新手。
非常感谢!
【问题讨论】:
只是一点观察(我认为它没有帮助,但无论如何):类ModelAdmin
没有Meta
属性,你可以删除它。它属于Model
类。另外 - 有什么原因,为什么你在 app1 中定义了App11stModelAdmin
,而你只在 app2 中使用它?
让我们说,我将这些模型/管理模型放在它们各自的应用程序中是有原因的......反正 tnx
【参考方案1】:
唯一可能导致这种情况的是,如果您的 admin.py 以两种不同方式导入。例如,以下被视为两个不同的模块,实际上会导致 admin.py 代码运行两次:
from foo.admin import FooAdmin
from myproject.foo.admin import FooAdmin
【讨论】:
就我而言,我认为这不是正在发生的事情,因为您可以从我提供的示例代码中进行验证。 tnx!【参考方案2】:admin.py
文件在运行时由 Django 执行,所以如果你将一个 admin.py
脚本导入另一个脚本,你实际上是在再次执行暴露的 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
时,输出文件仍然被写入。避免写入输出文件的唯一方法是注释掉脚本中执行的函数或将其包装到另一个函数中。
【讨论】:
好的,这就解释了。导入管理文件会在文件中执行“已经可以执行”的语句。所以,我为这个问题选择的走动就像你建议的那样。但我觉得有更好的方法来做到这一点。谢谢! 这是真假。admin.py
is 在 admin.autodiscover()
运行时导入,因此 OP 的导入计为一秒,但并不是那么简单。 Python 足够聪明,不会多次导入同一个模块(但它必须是完全相同的 same 模块、导入路径等等)。事实上,我正在从许多其他应用程序 admin.py 文件中的一个应用程序的 admin.py 导入而没有收到此错误。一切正常。以上是关于已在 /admin/ 处注册 Django 1.2 错误的主要内容,如果未能解决你的问题,请参考以下文章