Django DateField只有月份和年份



我发布这个是因为我找不到让我满意的答案/示例,我以一种我没有读过的方式解决了它。也许它可能有用或可以讨论。

基本上,我的应用程序显示用户可以在其中创建对象的窗体集。验证后,将再次显示表单集,用户可以添加新对象。 指定日期无关紧要。

我首先开始使用一些javascript来做到这一点,然后使用Django自定义模型(子类模型。日期字段(。

我无法成功地用后者做到这一点(我的帖子更新链接到这个( 由于我有截止日期,我使用简单的 ChoiceField 将对象存储为整数,然后使用 @property 方法从这些用户输入中构建适当的日期(将 1 添加为天(。

通过这种方式,我避免了在 Django 蒸汽管道中深入研究,甚至摆脱了日期选择器!

但是多亏了@property,我仍然可以在 Django 模板中保持格式化日期的便利性并进行日期计算等......

models.py :

注意:如果日期无法从填充字段中构建,请使用返回 None ,否则在尝试在模板中呈现这些@property字段时会出现未绑定错误。

class MyModel(models.Model):
YEAR_CHOICES = [(y,y) for y in range(1968, datetime.date.today().year+1)]
MONTH_CHOICE = [(m,m) for m in range(1,13)]
start_year = models.IntegerField(choices=YEAR_CHOICES,
default=datetime.datetime.now().year,)
start_month = models.IntegerField(choices=MONTH_CHOICE,
default=datetime.datetime.now().month,)
end_year = models.IntegerField(choices=YEAR_CHOICES,
default=datetime.datetime.now().year,)
end_month = models.IntegerField(choices=MONTH_CHOICE,
default=datetime.datetime.now().month,)
@property
def start_date(self):
if self.start_year and self.start_month:
return datetime.date(self.start_year, self.start_month, 1)
elif self.start_year:
return datetime.date(self.start_year, 12, 31)
else:
return None
@property
def end_date(self):
if self.end_year and self.end_month:
return datetime.date(self.end_year, self.end_month, 1)
elif self.end_year:
return datetime.date(self.end_year, 12, 31)
else:
return None

forms.py

class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
exclude = ("blabla",)

现在,如果要在表单模板中显示日期,可以使用:

{{ form.instance.start_date }}

希望它有帮助,欢迎提出建议!

对我来说不是太清楚,你到底在做什么? 如果要显示只有年份和月份的日期字符串。这将通过使用模板过滤器date和格式来实现,例如:{{ obj.created_at|date:'%y %m' }}.

但是如果我错了,您可能希望在您的 modelForm 中提交一个自定义文件来选择一个日期(只有年份和月份(,那么就像您已经做过的那样,但代码是问题

我认为您的start_dateend_date函数需要更改:

def start_date(self):
if self.start_year and self.start_month:
return datetime.date(self.start_year, self.start_month, 1)
elif self.start_year:
# return Jan 1st
return datetime.date(self.start_year, 1, 1)
else:
return None
def end_date(self):
if self.end_year and self.end_month:
if self.end_month == 12:
# if month is December, return December 31st
return datetime.date(self.end_year, self.end_month, 31)
else:
# else, get first day of next month and subtract 1 day.
return datetime.date(self.end_year, self.end_month+1, 1) - datetime.timedelta(days=1)
elif self.end_year:
return datetime.date(self.end_year, 12, 31)
else:
return None

相关内容

  • 没有找到相关文章

最新更新