自定义管理员索引:是否可以检索模型的原始名称?

时间:2011-12-28 15:40:33

标签: python django django-admin django-templates

我正在尝试自定义开源应用的管理索引而不会改变太多东西。

我认为通过检查app_list.models中包含的模型的名称,我可以轻松地完成我需要的操作。 类似的东西:

if model is "interface" or "device":
    show it

但是根据django实例的设置和语言,我找不到不会改变的值。

如果我在模板中打印一些信息:

{{ app_list.1.models.2 }}

我明白了:

{'perms':
  {'add': True, 'change': True, 'delete': True},
  'add_url': '/nodeshot-server/admin/nodeshot/interface/add/',
  'admin_url': '/nodeshot-server/admin/nodeshot/interface/',
  'name': <django.utils.functional.__proxy__ object at 0x7f67fced6ed0>
 }

add_url和admin_url取决于设置,实际上我的本地实例“nodeshot-server”是项目的文件夹,而在线只是“/ admin / nodeshot / ecc。”。 名称密钥也不可靠,因为它取决于使用的语言,因此如果语言是意大利语,则名称密钥不是“interface”而是“interfaccia”。

有没有办法在不更改视图的情况下检索模型的原始名称(而不是已翻译的名称)?我真的不知道“django.utils.functional ._ proxy ”是什么,虽然它看起来像是懒惰评估的机制。

如果不可能,我想我必须为管理索引编写自定义视图..对吗?

3 个答案:

答案 0 :(得分:1)

这里有两个选择。首先,是的,您可以简单地覆盖AdminSite.index并将您喜欢的任何内容传递给上下文。如果您采用这种方法,则必须创建并使用AdminSite子类,并手动注册您的应用(admin.autodiscover()将不再有效。)

第二种选择是尝试使用您提供的信息。 admin_url可能会因部分内容而发生变化,但最后一部分/nodeshot/interface对于该应用和模型总是相同的。您可以使用正则表达式搜索此作品并做出相应的响应。但是,由于您在此时处于模板中,因此您必须创建自定义模板标签或过滤器才能完成工作。过滤器可能是你最好的选择。您可以将模型dict传递给它并返回一个布尔值,然后您可以在if语句中使用它。

<强> nodeshot / templatetags / nodeshot_filters.py

import re

@register.filter
def goes_in_different_table(model_dict):
    if re.search(r'/nodeshot/interface/', model_dict['admin_url']):
        return True

    return False

<强>模板/管理/ app_index.html

{% load nodeshot_filters %}

{% if model|goes_in_different_table %}
    <!-- do something -->
{% endif %}

答案 1 :(得分:0)

每种型号都可以override the admin template。并且不要复制整个模板文件,只覆盖要更改的模板块。

答案 2 :(得分:0)

这个问题的正确答案是:

使用if子句中未更改的位:

{% if '/nodeshot/interface/' in model.admin_url %}