覆盖Django的DurationField显示

时间:2019-08-30 18:12:06

标签: django

我的模型有一个DurationField,可以在Django Admin中进行编辑。我不喜欢Django(从Python继承其行为)显示负持续时间的方式,因此我尝试猴子修补它:

test = lambda: duration.duration_string(datetime.timedelta(seconds=-5)) == \
    '-00:00:05'
if not test():
    _duration_string = duration.duration_string
    def duration_string(duration):
        if duration.days < 0:
            return '-' + _duration_string(-duration)
        return _duration_string(duration)
    duration.duration_string = duration_string
    assert test()

此代码作为我的AppConfig.ready()方法的一部分运行。

但是,在Admin中,该字段仍显示以默认方式设置格式的值。是否还有其他方法可以自定义如何在Admin中呈现DurationField的值?


在@Mehak的建议下,我在this question中尝试了该解决方案。实际上,我只是尝试创建一个自定义字段来轰炸程序:

class CustomDurationField(models.DurationField):
    def value_to_string(self, obj):
        raise Exception()

    def __str__(self):
        raise Exception()

在进行并应用课程迁移之后,查看或编辑字段时不会引发异常。

1 个答案:

答案 0 :(得分:0)

This answer使我走上了正确的轨道。执行完猴子补丁之后,我必须定义一个使用自定义表单字段的自定义模型字段...

import datetime

from django import forms
from django.db import models
from django.utils import duration


class CustomDurationFormField(forms.DurationField):
    def prepare_value(self, value):
        if isinstance(value, datetime.timedelta):
            return duration.duration_string(value)
        return value


class CustomDurationField(models.DurationField):
    def formfield(self, **kwargs):
        return super().formfield(**{
            'form_class': CustomDurationFormField,
            **kwargs,
        })

如果您不想猴子修补Django的django.utils.duration.duration_string,则只需更改CustomDurationFormField.prepare_value即可调用它的单独定义的版本。

我不完全确定为什么要花那么多精力来做到这一点,但是确实如此。