代码之家  ›  专栏  ›  技术社区  ›  Daniel Quinn

如何覆盖Django的admin app_index?

  •  2
  • Daniel Quinn  · 技术社区  · 8 年前

    我非常熟悉如何重写Django的管理 模板 ,但我还没有找到任何关于如何正确覆盖所述模板可用上下文的说明。例如本页:

    /admin/users/
    

    可以通过在以下位置创建文件来覆盖此页面的样式:

    root/users/templates/admin/users/app_index.html
    

    但是,如果我想做更多Python级别的事情呢 之前 模板已加载?具体来说,在我的例子中,我想为 /admin/users/ 为此,我需要运行一个相当复杂的查询。

    现在我知道我可以通过创建一个模板标记来解决这个问题,该标记可以为我执行查询,但坦白地说,这相当脏,因为您是从模板访问数据库的,所以我想这样做 较好的 如果存在这样的方式。

    然而,如果你能自信地(并且令人信服地)声明,如果不重写,这是不可能的 django.contrib.admin.sites.AdminSite.app_index ,然后我会标记你的答案为正确,并继续我的丑陋的黑客。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Community Patrick Maupin    7 年前

    这是可以做到的,无需重写 app_index 自从 AdminSite 旨在通过子类化进行自定义。

    看着 管理站点 在实现中,您可以看到 app_index 具有关键字参数 extra_context .您可以将其用于您的目的,以避免重写,如下所示:

    from django.contrib.admin import AdminSite
    
    class MyAdmin(AdminSite):
        def app_index(self, request, app_label, extra_context=None):
            if not extra_context:
                extra_context = {}
            extra_context['my_new_key'] = 'val'
    
            super().app_index(request, app_label, extra_context=extra_context)
    

    然后出现的问题是,您需要实例化自定义站点,并使用它来设置URL和注册模型管理员。如Alasdair所建议的,如果这不方便,您可以考虑 this .

    尽管如此,您仍然会在请求中访问数据库,这与您对标记的关注类似。只有缓存才能解决这个问题。