Django:只读字段外观的全局修改

时间:2019-03-05 09:19:53

标签: python django python-import

我想在django的新“ readonly mode”中自定义字段纹理:例如外键应显示为链接。

通常,我确定了以下选项:

  • 为每个模型实施自定义字段–导致代码重复
  • 重新实现Django的display_for_field方法

基本上,我可以复制并粘贴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代码:

  1. 在settings.py中的django.contrib.admin.utils中覆盖display_for_field函数:

    django.contrib.admin.utils
  2. 在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原始代码的唯一选择?

1 个答案:

答案 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