Django 如何对模型字段执行计算并在模板中显示值?
我有一个名为“候选者”的模型,其中包含“经验”、“新经验”、“发布日期”等字段。 我正在使用CreateView表单将值存储在数据库中。 当我第一次输入experience和date_posted(设置为timezone.now)时,“新体验”值默认也应设置为“experience”值。 现在这个“新体验”值应该在每个月之后增加 比如说,, 经验=2.4(2年4个月), 新体验=2.4(自动设置) 因此,如果我在1个月后打开模板(网站页面),则“经验”和“发布日期”值必须相同,但“新经验”值=2.5(2年,5个月) 另外,我想使用2.12(2年12个月)和3.1(2年13个月)的格式。Django 如何对模型字段执行计算并在模板中显示值?,django,django-templates,django-views,Django,Django Templates,Django Views,我有一个名为“候选者”的模型,其中包含“经验”、“新经验”、“发布日期”等字段。 我正在使用CreateView表单将值存储在数据库中。 当我第一次输入experience和date_posted(设置为timezone.now)时,“新体验”值默认也应设置为“experience”值。 现在这个“新体验”值应该在每个月之后增加 比如说,, 经验=2.4(2年4个月), 新体验=2.4(自动设置) 因此,如果我在1个月后打开模板(网站页面),则“经验”和“发布日期”值必须相同,但“新经验”值=2
如何实现这一点?也许您可以将您的
新体验设置为计算属性,而不是普通字段
from datetime import datetime
class Candidate:
# ...
experience = models.DateField()
@property
def new_experience(self):
now = datetime.now().date()
delta = now - self.date_posted
return (self.experience + delta)
更新
在您在评论中作出澄清后,我的建议是将经验
领域分为几年和几个月:
class Candidate:
# ...
experience_years = models.IntegerField()
experience_months = models.IntegerField()
@property
def new_experience(self):
base_experience = datetime.datetime(year=self.expreience_years, month=self.experience_months, day=1)
delta = datetime.datetime.now() - self.date_posted
new_experience = base_experience + delta
# now you can access new_experience.year, new_experience.month
return new_experience
另一个选项是返回一个来自新经验的元组(年、月)
,如上所述
警告:又快又脏但未测试哦,但这会给我2.1、2.2等格式的值吗?比如,如果我把经验作为一个日期字段,那么它将在日期格式(dd/mm/yy)中有一个特定的值,如果我从当前日期中减去它,我将得到一个日期格式,再次加回去只会给我当前日期,不是吗?你是对的:)我应该使用date\u posted
而不是experience来减去它,请查看更新的答案,然后您可以使用a按您的意愿显示它。是否“体验”仍然是一个日期字段?我以前把它作为CharField保存,因为它只需要存储2.1、2.2等值。基本上,我用它来为求职者找工作。所以我需要存储他的详细信息并保持跟踪。如果在发布的日期,他的工作经验是5年,如果我在5个月后查看他的个人资料,那么他的工作经验实际上是5.5年。这就是为什么我用新的经验来存储它。
class Candidate:
# ...
experience_years = models.IntegerField()
experience_months = models.IntegerField()
@property
def new_experience(self):
base_experience = datetime.datetime(year=self.expreience_years, month=self.experience_months, day=1)
delta = datetime.datetime.now() - self.date_posted
new_experience = base_experience + delta
# now you can access new_experience.year, new_experience.month
return new_experience