Django-自定义模型方法-如何指定数据类型以便管理员正确格式化它?

Django-自定义模型方法-如何指定数据类型以便管理员正确格式化它?,django,django-models,django-admin,Django,Django Models,Django Admin,例如: class MyModel(models.Model): field1=models.CharField(..) field2=models.DateTimeField() def today(self): return self.field2 当我在管理站点中查看此字段时,field2的格式与today字段的格式不同 我怎样才能告诉管理员网站对待今天就像对待field2一样?例如,告诉Django管理员“今天”是models.datetime字

例如:

class MyModel(models.Model):
    field1=models.CharField(..)
    field2=models.DateTimeField()
    def today(self):
        return self.field2
当我在管理站点中查看此字段时,field2的格式与today字段的格式不同

我怎样才能告诉管理员网站对待今天就像对待field2一样?例如,告诉Django管理员“今天”是models.datetime字段

下面是它展示的内容:

Field2                  today
April 5, 2011, 9:10 a.m.    2011-04-11 08:47:27

要获取
DateTime
对象调用
DateTime.DateTime.now()
而不是
DateTime.DateTime.today()

编辑:

或者对
field2
使用
models.DateField()

编辑2:

以下是解决方案:

def today(self):
    from django.utils import formats
    return formats.localize(self.field2)

要获取
DateTime
对象调用
DateTime.DateTime.now()
而不是
DateTime.DateTime.today()

编辑:

或者对
field2
使用
models.DateField()

编辑2:

以下是解决方案:

def today(self):
    from django.utils import formats
    return formats.localize(self.field2)

这真是奇怪的行为。总的来说,这可能与django设置有关;特别是DATETIME_格式(和相关)设置。框架可能会对字段进行内省,如果字段是DateTime类型,则会根据上述设置进行呈现

在大多数情况下,内省方法是没有意义的,所以如果是这样的话,我可以理解这种行为

尝试相应地修改设置(提供不同的日期时间格式),然后查看字段是否更改,方法是否保持不变

编辑:

查看django.contrib.databrowse.datastructures,有一段代码执行以下操作:

if isinstance(self.field, models.DateTimeField):
    objs = capfirst(formats.date_format(self.raw_value, 'DATETIME_FORMAT'))
我会想象类似的事情发生在管理应用程序中,尽管我目前找不到确切的参考

要实现您的目标,您需要适当设置日期时间格式:

def today(self):
    from django.conf import settings
    return self.field2.strftime(settings.DATETIME_FORMAT)
或者,使用@cata的评论:

def today(self):
    from django.utils.formats import localize
    return localize(self.field2)

这真是奇怪的行为。总的来说,这可能与django设置有关;特别是DATETIME_格式(和相关)设置。框架可能会对字段进行内省,如果字段是DateTime类型,则会根据上述设置进行呈现

在大多数情况下,内省方法是没有意义的,所以如果是这样的话,我可以理解这种行为

尝试相应地修改设置(提供不同的日期时间格式),然后查看字段是否更改,方法是否保持不变

编辑:

查看django.contrib.databrowse.datastructures,有一段代码执行以下操作:

if isinstance(self.field, models.DateTimeField):
    objs = capfirst(formats.date_format(self.raw_value, 'DATETIME_FORMAT'))
我会想象类似的事情发生在管理应用程序中,尽管我目前找不到确切的参考

要实现您的目标,您需要适当设置日期时间格式:

def today(self):
    from django.conf import settings
    return self.field2.strftime(settings.DATETIME_FORMAT)
或者,使用@cata的评论:

def today(self):
    from django.utils.formats import localize
    return localize(self.field2)
如果您选择通过自己的函数提供“列表显示”项,并且您对默认输出不满意,则需要自己对其进行格式化。在这种情况下,如果希望与DateTime数据库字段的格式相同,请执行以下操作:

from django.utils import formats
def today(self):
        return formats.localize(self.field2)
背景:

templates/admin/change_list.html
使用模板标记

django.contrib.admin.templatetags.admin_list.result_list
而这反过来又会调用

django.contrib.admin.templatetags.admin_list.items_for_result()
渲染每行的单个列值

您将看到,通过数据库查找或调用函数,这两个值开始时都是DateTime实例,请参阅

django.contrib.admin.util.lookup_field()
但返回值“f”只有在存在数据库字段时才是字段。您提供了一个函数,因此lookup_field()将只提供值,“f”将为None

因此,在\u result()的项目\u中,您的值将通过“if f is None”块运行,并在

result_repr = display_for_field(value, f)
换句话说,

django.contrib.admin.util.display_for_field()
将仅对数据库值调用,以根据字段类型格式化,因此这是您的函数值缺少的处理方法:

elif isinstance(field, models.DateField) or isinstance(field, models.TimeField):
    return formats.localize(value)
您需要自己完成最后一行,如上所示

编辑:关于你的问题

我怎样才能告诉管理员网站处理 今天好像是在治疗field2?即。, 告诉Django管理员“今天”是 模型。DateTimeField

它不是models.datetime字段,而是函数值。如果它是models.DateTimeField,它将描述您的模型。看看所有需要的东西: 在您的示例中,您实际上可以使用field2。显然,你想对它的价值做一些事情,计算它,等等-那么今天的.db_列是什么呢

也就是说,如果在默认情况下通过format.localize()运行DateTime实例的函数值会更好,因为关于本地化的文档似乎很有希望这样做。 顺便说一句,我宁愿在ModelAdmin中定义格式化值,而不是在模型本身中定义格式化值。我通常称之为“formatted_today”(保留原始today()的datetime值),只是如果管理员是唯一需要格式化值的地方,imho就是应该定义格式化值的地方。

如果您选择通过自己的函数提供“list_display”项,并且您对默认输出不满意,你需要自己格式化它。在这种情况下,如果希望与DateTime数据库字段的格式相同,请执行以下操作:

from django.utils import formats
def today(self):
        return formats.localize(self.field2)
背景:

templates/admin/change_list.html
使用模板标记

django.contrib.admin.templatetags.admin_list.result_list
而这反过来又会调用

django.contrib.admin.templatetags.admin_list.items_for_result()
渲染每行的单个列值

您将看到,通过数据库查找或调用函数,这两个值开始时都是DateTime实例,请参阅

django.contrib.admin.util.lookup_field()
但返回值“f”只有在存在数据库字段时才是字段。您提供了一个函数,因此lookup_field()将只提供值,“f”将为None

因此,在\u result()的项目\u中,您的值将通过“if f is None”块运行,并在

result_repr = display_for_field(value, f)
换句话说,

django.contrib.admin.util.display_for_field()
将只调用数据库值以根据字段类型进行格式化,因此这是函数va的处理方法