我正在尝试自定义开源应用的管理索引而不会改变太多东西。
我认为通过检查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 ”是什么,虽然它看起来像是懒惰评估的机制。
如果不可能,我想我必须为管理索引编写自定义视图..对吗?
答案 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 %}