gpt4 book ai didi

django - 如何覆盖 Django admin `change_list.html` 以随时随地提供格式

转载 作者:行者123 更新时间:2023-12-05 06:36:11 25 4
gpt4 key购买 nike

在 Django 管理中,如果我想显示 Iron 列表及其各自的格式化权重,我必须这样做。

class IronAdmin(admin.ModelAdmin):
model = Iron
fields = ('weight_formatted',)

def weight_formatted(self, object):
return '{0:.2f} Kg'.format(object.weight)
weight_formatted.short_description = 'Weight'

I.e: 500.00 Kg

然而,这样做的问题是,我必须为每个要格式化的字段编写一个方法,当我有 10 个或更多对象要格式化时,它就变得多余了。

是否有一种方法可以覆盖以“捕获”这些值并在它们呈现到 html 上之前指定格式? IE。不必为每个 Admin 类编写一个方法,我可以只编写以下内容并对其进行格式化。

class IronAdmin(admin.ModelAdmin):
model = Iron
fields = ('weight__kg',)

def overriden_method(field):
if field.name.contains('__kg'):
field.value = '{0:.2f} Kg'.format(field.value)

I.e: 500.00 Kg

最佳答案

经过几个小时的搜索,我终于弄明白了!我意识到这不是最有效的代码,在大多数用例中它可能比它的值(value)更麻烦,但对我来说已经足够了。如果其他人需要一种快速而肮脏的方式来做到这一点:

为了使其自动化,我不得不用以下代码覆盖 django.contrib.admin.templatetags.admin_list.result_list:

def result_list_larz(cl):
"""
Displays the headers and data list together
"""
resultz = list(results(cl)) # Where we override

""" Overriding starts here """
""" Have to scrub the __kg's as result_header(cl) will error out """
for k in cl.list_display:
cl.list_display[cl.list_display.index(k)] = k.replace('__kg','').replace('__c','')
headers = list(result_headers(cl))

num_sorted_fields = 0
for h in headers:
if h['sortable'] and h['sorted']:
num_sorted_fields += 1
return {'cl': cl,
'result_hidden_fields': list(result_hidden_fields(cl)),
'result_headers': headers,
'num_sorted_fields': num_sorted_fields,
'results': resultz}

然后覆盖 results(cl)items_for_result() 的调用,然后我们覆盖它对 lookup_field() 的调用,如下所示:

def lookup_field(name, obj, model_admin=None):
opts = obj._meta
try:
f = _get_non_gfk_field(opts, name)
except (FieldDoesNotExist, FieldIsAForeignKeyColumnName):
# For non-field values, the value is either a method, property or
# returned via a callable.
if callable(name):
attr = name
value = attr(obj)
elif (model_admin is not None and
hasattr(model_admin, name) and
not name == '__str__' and
not name == '__unicode__'):
attr = getattr(model_admin, name)
value = attr(obj)

""" Formatting code here """
elif '__kg' in name or '__c' in name: # THE INSERT FOR FORMATTING!

actual_name = name.replace('__kg','').replace('__c', '')
value = getattr(obj, actual_name)
value = '{0:,.2f}'.format(value)

prefix = ''
postfix = ''
if '__kg' in name:
postfix = ' Kg'
elif '__c' in name:
prefix = 'P'

value = '{}{}{}'.format(prefix, value, postfix)
attr = value
else:
attr = getattr(obj, name)
if callable(attr):
value = attr()
else:
value = attr
f = None
""" Overriding code END """

else:
attr = None
value = getattr(obj, name)
return f, attr, value

关于django - 如何覆盖 Django admin `change_list.html` 以随时随地提供格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49230092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com