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的处理方法