Django,如何在没有模型的情况下生成管理面板?

5 投票
4 回答
6815 浏览
提问于 2025-04-15 16:29

我正在做一个比较大的项目,基本上包括以下内容:

服务器1:
基于Ice的服务。
使用Glacier2来处理会话。
防火墙允许访问Glacier2。

服务器2:
通过Glacier2为Ice服务提供的网页界面(只读,公开)。
通过Glacier2为Ice服务提供的管理界面。

我最关心的是网页界面。我想用Django,因为它是用Python写的,而且有一个非常实用的自动生成管理面板的功能。

这个网页界面不连接任何数据库。它通过Glacier2路由器连接到服务器1上的Ice服务,并使用这些服务提供的API来处理数据。

正如你可能知道的,Django的管理面板生成依赖于Django的ORM(对象关系映射);但我不使用它,因为我没有数据库可以访问。

所以我需要生成管理面板,但我需要做的是,不像ORM通常那样进行标准的数据访问,而是拦截任何“数据库访问”的调用,把它们转换成Ice服务的调用,然后获取服务的输出(如果有的话),再把它转换成ORM通常返回的格式,然后把控制权交还给Django。

有没有人知道我该怎么做?我需要重写哪个部分?有没有具体的想法?

谢谢你的时间。

4 个回答

1

你可以“模拟”某个类,让它看起来像一个模型,但实际上它是通过你的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兼容的事情。

3

contrib.admin的真正强大之处在于django表单。简单来说,管理员工具基本上是自动生成一个表单,用来匹配一个模型,同时还加了一点urls.py的路由设置。最终,可能直接使用django表单会更简单,而不需要依赖管理员工具。

7

我觉得有比自己写复杂的ORM更简单的方法来实现你想要的管理员集成。我在一个应用中用过这个方法,这个应用可以通过他们的控制面板API来管理Webfaction的邮箱账户。

你可以看看这里的models.py、admin.py和urls.py:django-webfaction

要在管理员首页创建一个条目,可以使用一个虚拟模型,并把managed设置为False。

然后把这个模型注册到管理员那里。

这样你就可以拦截管理员的URL,把它们指向你自己的视图。

如果管理员提供的添加、编辑、删除功能对你的应用有用,那这样做是合理的。否则,你最好覆盖管理员的首页或更改列表模板,加入你自己的自定义操作。

撰写回答