2010-11-10 66 views
17

我有一个对象,我想在管理下使用而不是继承models.Model的模型。如果我让它继承models.Model,这个对象将在数据库中创建一个我不想要的表。我只想让这个对象留在内存中。是否可以在没有模型的情况下创建自定义管理视图

一个解决方案我来自堆栈溢出的好人的帮助是我创建管理视图,通过admin.py下的modelAdmin(admin.site.register())注册这些自定义视图,并使用此模型对象作为动态数据存储(在内存中)。

由于此模型像对象不会继承models.Model,admin.site.register()(在admin.py下)并不接受它,并显示'类型'对象不可迭代'错误,当我尝试在浏览器中访问它

+0

您可以连接额外的浏览量达到一个特定的模型(以及做任何你想在其中,相关的模型或没有;如果你愿意,我可以张贴的答案与此解决方案),但我不知道有什么方法可以创建一个纯粹的独立管理视图,而不是黑客管理源。 – eternicode 2010-11-10 21:19:39

+0

@eternicode实际上完全可以创建独立的管理视图:请参阅我的答案。 – 2010-11-10 22:09:44

+0

@Daniel Roseman,啊!我从来没有见过这种功能,虽然TBH我从来不需要它。 – eternicode 2010-11-10 22:20:01

回答

10

嗯。谢谢大家的帮助。我想出的解决方案(在您的帮助ofcourse :)如下:

我有两个自定义模板:

my_model_list.html 
    my_model_detail.html 

在views.py:

class MyModel(object): 
    # ... Access other models 
    # ... process/normalise data 
    # ... store data 

@staff_member_required 
def my_model_list_view(request) #show list of all objects 
    #. . . create objects of MyModel . . . 
    #. . . call their processing methods . . . 
    #. . . store in context variable . . . 
    r = render_to_response('admin/myapp/my_model_list.html', context, RequestContext(request)) 
    return HttpResponse(r) 

@staff_member_required 
def my_model_detail_view(request, row_id) # Shows one row (all values in the object) in detail  
    #. . . create object of MyModel . . . 
    #. . . call it's methods . . . 
    #. . . store in context variable . . . 
    r = render_to_response('admin/myapp/my_model_detail.html', context, RequestContext(request)) 
    return HttpResponse(r) 

在主的Django网址。潘岳:

urlpatterns = patterns( 
    '', 
    (r'^admin/myapp/mymodel/$', my_model_list_view), 
    (r'^admin/myapp/mymodel/(\d+)/$', my_model_detail_view), 
    (r'^admin/', include(admin.site.urls)) 
) 
+1

很高兴你自己想通了。我正要对此发表评论。没有模型的管理视图基本上只是一个正常的Django视图,使用带有模拟ModelAdmin实例的管理模板,这基本上就是你在做什么。我自己做了这个来创建一些自定义的管理主题页面。 – Cerin 2013-12-27 16:31:30

2

最直接的答案是“否”。正如Django Book所说,管理员是“受信任的用户编辑结构化内容”,在这种情况下,结构化内容是按层次结构排列和配置的模型通过settings.py。更重要的是,如果你的对象不完全鸭式完成与预期关系的models.Model,管理员可能会折腾例外所有的地方。

然而,随着口头禅说,“这只是python”。你可以覆盖admin中的任何页面。只需在您的项目中创建您自己的模板,并让它们在模板搜索中排名第一。另外,通过继承admin/base.html,您可以保持管理项目的外观&。

写下您的管理视图和模板这个对象,就像任何其他人,但要确保包裹在is_staff装饰的意见,以确保视图从访问未经授权的用户的保护。使用templates/admin/object_list.html和object_form.html将这些文件放在应用程序中,也许在admin/views.py中。

一旦您对这些非数据库对象有适当的管理工具,然后您可以通过管理索引页面提供对它们的访问:您想要覆盖admin/index.html,并向该页面提供其他项目特定的项目如所须。

我做的正是这种以提供存储我们的数据,如ConstantContact电子邮件服务的第三方API的管理员权限,并且它工作得很好。

+0

感谢您的帮助精灵。我已经在下面发布了我的解决方案答案,但林不知道我是否完全按照您的建议。 – sysasa 2010-11-11 15:24:14

5

您可以将您的意见直接添加到AdminSite对象,而不是您注册的任何特定ModelAdmin子类。

默认AdminSite通过django.contrib.admin.site访问,这就是你所谓注册和自动发现什么。您可以创建自己的子类和add your own views to it,而不是使用此类,然后根据该模型注册模型而不是默认模型。

+0

有趣;我假设这些子类是由一个'autodiscover'调用拾取的?或者您的子类需要在整个网站的应用程序中使用才能生效? (其实,我觉得我没有正确理解这个概念......) – eternicode 2010-11-10 22:26:10

+0

谢谢你的帮助Daniel!以下解决方案,但不完全确定这是你的意思。无论如何,它的作品! :) – sysasa 2010-11-11 15:25:17

相关问题