我的模型有一个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()
在进行并应用课程迁移之后,查看或编辑字段时不会引发异常。
答案 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
即可调用它的单独定义的版本。
我不完全确定为什么要花那么多精力来做到这一点,但是确实如此。