是否可以在没有模型的情况下创建自定义管理视图

时间:2010-11-10 20:48:13

标签: django admin

我有一个对象,我想在admin下使用而不是继承models.Model的模型。如果我让它继承models.Model,这个对象将在数据库中创建一个我不想要的表。我只希望这个对象留在内存中。

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

由于这个类似对象的模型不继承自models.Model,admin.site.register()(在admin.py下)不接受它并显示'type'对象不可迭代“我尝试访问时出错它在浏览器中。

3 个答案:

答案 0 :(得分:14)

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

我有两个自定义模板:

   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 urls.py:

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 :(得分:5)

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

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

答案 2 :(得分:2)

最直截了当的答案是“不”。正如Django Book所说,管理员是“可信用户编辑结构化内容”,在这种情况下,结构化内容是按层次结构排列并通过settings.py配置的模型。更重要的是,如果你的对象没有完全对类型的模型进行处理,那么管理员可能会在整个地方抛出异常。

然而,正如咒语所说:“这只是蟒蛇。”您可以覆盖admin中的任何页面。只需在项目中创建自己的模板,然后在模板搜索中首先使用它们。此外,通过继承admin / base.html,您可以保持外观和效果。管理项目的感觉。

为此对象编写管理视图和模板,就像其他任何人一样,但要确保将视图包装在is_staff装饰器中,以确保视图不被未经授权的用户访问。将这些内容放在应用程序中,可能在admin / views.py中,使用templates / admin / object_list.html和object_form.html。

一旦为这些非数据库对象提供了适当的管理工具,就可以通过管理索引页面提供对它们的访问:您希望覆盖admin / index.html,并向页面提供其他项目特定的项目。需要的。

我这样做是为了提供对存储我们数据的第三方API的管理访问权限,例如ConstantContact电子邮件服务,而且效果非常好。