如何自定义Django modle的field.value_to_string(self)的日期时间字段?

1 人关注

比方说,我有一个模型

class Job(Model):
     created_on = DateTimeField(_("Created On"), auto_now=True, editable=False)
     name = CharField(_("Name"), max_length=300, blank=False)

现在,我试图将所有字段与它们的粗略名称和值集合起来,在一个模板中显示。

我的聚合函数。

def get_fields(self):
    result = []
    for field in Job._meta.fields:
        result.append((field.name, field.verbose_name, field.value_to_string(self)))

这给了我正确的字符串值,然而对于一个日期时间字段,我最终得到了一个愚蠢的未格式化的字符串,如2021-02-13T22:39:47.561045+00:00 我真的不想通过专门检查特定字段的方式来检查和修改数值,因为这是我的get_field函数的全部意义所在。

我觉得以下任何一种对我来说都应该很好用。

  • Somehow provide the default format to use when calling value_to_string()
  • Get a proper dateTime object instead, in which case the value should show up fine on the template
  • Get field type and then instead of calling value_to_string() I manually convert the string to this type (This seems feasible from what I see but feels too hacky of a solution)
  • python
    django
    django-models
    L Lawliet
    L Lawliet
    发布于 2021-02-15
    2 个回答
    SDRJ
    SDRJ
    发布于 2021-02-15
    已采纳
    0 人赞同

    @L Lawliet- 类似这样的东西是否可行。你可以把它作为模型方法加入。

    def get_formatted_date(self):
            return self.created_on.strftime("%Y-%m-%d %H:%M:%S")
    

    替代方法--来源在Django中对DateTimeField进行格式化

    class CustomDateTimeField(models.DateTimeField):
        def value_to_string(self, obj):
            val = self.value_from_object(obj)
            if val:
                val.replace(microsecond=0)
                return val.isoformat()
            return ''
    

    in your model

       created_on = CustomDateTimeField(auto_now_add=True)
        
    如果我把它定义为一个属性,我可以让它工作,但问题是,如果我这样做,在我的聚合函数中,我必须专门为这个字段制造一个例外,这正是我想避免的。
    SDRJ
    @LLawliet- 我已经做了一些编辑。你可以试试,看看是否有效?
    谢谢。显然,基本的field.value_from_object(self)对我的情况有效,但对于默认情况下获得一个自定义格式,这似乎是理想的做法
    L Lawliet
    L Lawliet
    发布于 2021-02-15
    0 人赞同

    以下是对我有用的方法。

    field.value_from_object(self)