Django,如何在没有模型的情况下生成管理面板?
我正在做一个比较大的项目,基本上包括以下内容:
服务器1:
基于Ice的服务。
使用Glacier2来处理会话。
防火墙允许访问Glacier2。
服务器2:
通过Glacier2为Ice服务提供的网页界面(只读,公开)。
通过Glacier2为Ice服务提供的管理界面。
我最关心的是网页界面。我想用Django,因为它是用Python写的,而且有一个非常实用的自动生成管理面板的功能。
这个网页界面不连接任何数据库。它通过Glacier2路由器连接到服务器1上的Ice服务,并使用这些服务提供的API来处理数据。
正如你可能知道的,Django的管理面板生成依赖于Django的ORM(对象关系映射);但我不使用它,因为我没有数据库可以访问。
所以我需要生成管理面板,但我需要做的是,不像ORM通常那样进行标准的数据访问,而是拦截任何“数据库访问”的调用,把它们转换成Ice服务的调用,然后获取服务的输出(如果有的话),再把它转换成ORM通常返回的格式,然后把控制权交还给Django。
有没有人知道我该怎么做?我需要重写哪个部分?有没有具体的想法?
谢谢你的时间。
4 个回答
你可以“模拟”某个类,让它看起来像一个模型,但实际上它是通过你的API来工作的。
比如说:
class QuerysetMock(object):
def all():
return call_to_your_api()
[...]
class MetaMock(object):
def fields():
return fields_mock_objects..
verbose_name = ''
[...]
class ModelMock(object):
_meta = MetaMock()
objects = QuerysetMock()
admin.site.register(ModelMock)
这样做可能有效……但你需要做很多与django.model兼容的事情。
contrib.admin的真正强大之处在于django表单。简单来说,管理员工具基本上是自动生成一个表单,用来匹配一个模型,同时还加了一点urls.py的路由设置。最终,可能直接使用django表单会更简单,而不需要依赖管理员工具。
我觉得有比自己写复杂的ORM更简单的方法来实现你想要的管理员集成。我在一个应用中用过这个方法,这个应用可以通过他们的控制面板API来管理Webfaction的邮箱账户。
你可以看看这里的models.py、admin.py和urls.py:django-webfaction
要在管理员首页创建一个条目,可以使用一个虚拟模型,并把managed设置为False。
然后把这个模型注册到管理员那里。
这样你就可以拦截管理员的URL,把它们指向你自己的视图。
如果管理员提供的添加、编辑、删除功能对你的应用有用,那这样做是合理的。否则,你最好覆盖管理员的首页或更改列表模板,加入你自己的自定义操作。