django - 只有月份和年份的 Django DateField
问题描述
我发布这个是因为我找不到一个让我满意的答案/例子,我用我没有读过的方式解决了它。也许它可能有用或可以讨论。
基本上,我的应用程序显示用户可以在其中创建对象的表单集。一旦验证,表单集将再次显示,用户可以添加新对象。指定日期无关紧要。
我首先开始使用一些 javascript 来做到这一点,然后使用 Django 自定义模型(子类 models.DateField)。
后来我无法成功地做到这一点(我的帖子更新链接到这个)因为我有最后期限,我用简单的 ChoiceField 将对象存储为整数,然后使用@property 方法从这些中构建一个正确的日期用户输入(添加 1 作为天)。
这样我就避免了深入研究 Django 蒸汽管道,甚至摆脱了日期选择器!
但是感谢@property,我仍然可以方便地在Django模板中格式化日期并进行日期计算等......
模型.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
表格.py
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
exclude = ("blabla",)
现在,如果您想在表单模板中显示日期,您可以使用:
{{ form.instance.start_date }}
希望对您有所帮助,欢迎提出建议!
解决方案
我认为你的start_date
和end_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
推荐阅读
- arrays - 如何从分布在数组中多个字节的位中检索值?
- javascript - 从中获取行数
零件 - c - 我用 C 语言编写了一个程序,它接受两个输入,x 和 n,并将 x 提高到 n 次方。10^10 不起作用,发生了什么?
- r - I want to simulate and obtain best ARIMA ith number of time in R
- image-processing - skimage 分水岭“过度分割”背后的关键参数
- swift - Xcode 警告:不可变属性将不会被解码,因为它声明了一个不能被覆盖的初始值
- python - R 中 (matrix)*(vector) 的 Python 等价物
- r - 锁定 FlexDashboard Markdown 以进行编辑
- spring-boot - Intelliji Idea 无法访问 org.springframework.plugin.core.Plugin
- javascript - 如何让 2 个用户加入 socket.io 中的同一个房间进行 1 对 1 聊天?