django admin从动作中注册动态模型

时间:2012-11-01 19:29:18

标签: python django dynamic django-models django-admin

我有奇怪的问题。在admin.py中,我可以说:

admin.site.register(MyModel)

这显然很好。现在我希望这个模型在用户操作时自动加载:

def user_action_from_admin_panel(......):
    .....
    admin.site.register(MyModel)

MyModel类在管理员中显示为没有链接的纯文本。 有什么想法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

可能你需要这个

from django.core.urlresolvers import clear_url_caches
from django.utils.importlib import import_module


def user_action_from_admin_panel(......):
    .....
    admin.site.register(MyModel)
    reload(import_module(settings.ROOT_URLCONF))
    clear_url_caches()

答案 1 :(得分:2)

  

动态创建的模型不会显示在管理员中,除非他们的app_labels与INSTALLED_APPS中列出的包匹配

     

这又是设计,不应被视为错误。

确保在创建模型时添加app_label

model = create_model('DynamicModel', app_label='existing_app')

还要重新加载您的网址,以便新模型获取链接

# after creating model
from django.utils.importlib import import_module
reload(import_module(settings.ROOT_URLCONF))

来源:https://code.djangoproject.com/wiki/DynamicModels#Admininterface

答案 2 :(得分:0)

如果我无权添加/更改,我会有黑色链接。

尝试重新定义您的管理类:

class MyModelAdmin(admin.ModelAdmin):

    def has_add_permission(self, request):
        return True

    def has_change_permission(self, request):
        return True
...

admin.site.register(MyModel, MyModelAdmin)

答案 3 :(得分:0)

原因可能是因为Django找不到与该模型相关的任何URL匹配的admin部分。因此,管理区域中的模型行将被设置为禁用,并且不会添加其他添加或编辑链接。

在某些情况下,在构建管理URL(django.contrib.admin.site.AdminSite.get_urls())后会触发注册模型的代码。解决方法是更新全局URL的整个管理URL,或使用名为{的Django应用程序{3}},它会自动将所有自定义模型加载到管理员中,而无需添加任何其他代码。