【问题标题】:is it possible to create a custom admin view without a model behind it是否可以在没有模型的情况下创建自定义管理视图
【发布时间】:2011-05-08 03:05:15
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以将额外的视图连接到特定模型(并在其中做任何您想做的事情,无论是否与模型相关;如果您愿意,我可以使用此解决方案发布答案​​),但我除了破解管理源之外,不知道有什么方法可以创建纯粹的独立管理视图。
  • @eternicode 实际上完全有可能创建独立的管理视图:请参阅我的答案。
  • @Daniel Roseman,啊,所以!我以前从未见过这个功能,虽然 TBH 我从来不需要它。

标签: django admin


【解决方案1】:

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

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

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

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

我这样做是为了提供对存储我们数据的第三方 API 的管理访问权限,例如 ConstantContact 电子邮件服务,它运行良好。

【讨论】:

  • 感谢精灵的帮助。我已经在下面发布了我的解决方案答案,但我不确定我是否完全遵循了你的建议。
【解决方案2】:

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

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

【讨论】:

  • 有趣;我假设这些子类被autodiscover 调用?或者您的子类是否需要在整个站点的应用程序中使用才能有效? (其实我觉得我没有正确理解这个概念......)
  • 感谢丹尼尔的帮助!下面发布的解决方案,虽然不完全确定这是你的意思。无论如何,它有效! :)
【解决方案3】:

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

我有两个自定义模板:

   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 ) )
)

【讨论】:

  • 很高兴您自己解决了这个问题。我正要发表同样的评论。没有模型的管理视图基本上只是使用带有模拟 ModelAdmin 实例的管理模板的普通 Django 视图,这基本上就是您正在做的事情。我自己创建了一些以管理员为主题的自定义页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2013-08-21
  • 2014-06-16
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多