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

sys*_*asa 21 django admin

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

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

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

sys*_*asa 17

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

我有两个自定义模板:

   my_model_list.html
   my_model_detail.html
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

在主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 ) )
)
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 6

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

可以通过访问默认的AdminSite django.contrib.admin.site,这就是您所说的注册和自动发现.您可以创建自己的子类并添加自己的视图,而不是使用,然后根据它而不是默认模型注册模型.


Elf*_*erg 5

最直接的答案是“不”。正如 Django Book 所说,管理员用于“编辑结构化内容的受信任用户”,在这种情况下,结构化内容是按层次结构排列的模型,并通过 settings.py 配置。更重要的是,如果您的对象没有完全鸭子类型到具有预期关系的 models.Model ,管理员可能会到处抛出异常。

然而,正如口头禅所说,“这只是蟒蛇”。您可以覆盖管理中的任何页面。只需在项目中创建您自己的模板,并将它们放在模板搜索中的第一位即可。此外,通过继承 admin/base.html,您可以保持管理项目的外观和感觉。

与其他对象一样,为此对象编写管理视图和模板,但请确保将视图包装在 is_staff 装饰器中,以确保视图免受未经授权的用户访问。将它们放在应用程序中,也许在 admin/views.py 中,以及 templates/admin/object_list.html 和 object_form.html。

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

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