我想在django的新“ readonly mode”中自定义字段纹理:例如外键应显示为链接。
通常,我确定了以下选项:
基本上,我可以复制并粘贴django.contrib.admin.utils模块,插入我的更改,覆盖"scheduler": {"frequency": "Day","interval": 1,"offset": "03:00:00","style": "StartOfInterval"}
,但这很丑陋,因为在将来进行Django更新时具有可维护性。
因此,我决定使用以下方法仅覆盖sys.modules['django.contrib.admin.utils'] = myutils
的display_for_fields方法,以避免重复Django代码:
在settings.py中的django.contrib.admin.utils中覆盖display_for_field函数:
django.contrib.admin.utils
在myapp.utils.py中:
from myapp.contrib.admin import utils
utils.override_method()
但是问题是:display_for_field使用以下命令导入django.contrib.admin.helpers中:
from django.contrib.admin import utils
from django.contrib.admin.utils import *
def display_for_field_mod(value, field, empty_value_display):
if isinstance(field, models.ForeignKey) and value:
if field.related_model.__name__.lower() != 'user':
link_string = 'admin:myapp_' + field.related_model.__name__.lower() + '_change'
link = reverse(link_string, args=(value.id,))
return format_html('<a href="{}">{}</a>', link, value)
else:
return formats.localize(value)
else:
return display_for_field(value, field, empty_value_display)
def override_method():
utils.display_for_field = display_for_field_mod
因此,由于导入功能的范围,我无法从外部覆盖此功能。
我还想念其他明显的可能性吗?有没有一种干净的方法可以做到这一点,还是复制/修改django原始代码的唯一选择?
答案 0 :(得分:0)
我遇到了类似的问题。如果有人仍在寻找解决方案,则只需覆盖display_for_field
中的helpers
,例如:
from django.contrib.admin import helpers, utils
def override_method():
helpers.display_for_field = display_for_field_mod
utils.display_for_field = display_for_field_mod
仅覆盖helpers
就足够了,但是为了以防万一,也最好覆盖utils
。