已在/admin/Django 1.2注册错误
我在Django 1.2 admin中遇到此错误 情景: 我的项目中有两个应用程序,比如已在/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
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
输出。与从示例导入乘数
中有选择地导入乘数
函数(如)时的情况相同,输出文件仍被写入。避免写入输出文件的唯一方法是注释掉脚本中已执行的函数或将其包装到另一个函数中。只是观察一下(我认为这没有帮助,但无论如何):classModelAdmin
没有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