Django 自定义字段来处理只有月份和年份的日期字段



---------------- 编辑--------------------

我无法使用自定义模型字段成功做到这一点,我不得不继续前进,所以实际上,我按照本文末尾指定的替代方式完成了它。

这是公开解决方案的新帖子的链接。

----------------结束编辑--------------------

"我的应用"显示用户可以在其中创建对象的窗体集。验证后,将再次显示表单集,用户可以添加新对象。

日期只能是月份和年份("%m/%Y"(。

我可以在输入字段(通过 jquery(上工作,在输入的日期前面添加"01/"。但在提交后,该字段现在显示"%d/%m/%Y"(正常(。

因此,我正在寻找一种方法将输入字符串(例如:09/2018(转换为dateField以存储在数据库中,然后在从数据库中检索数据时将此dateField转换为字符串。

我知道,我可以简单地使用一个表格查菲尔德几个月,另一个表格多年。

但我想将其保留为日期对象,因此,在模板中,我可以执行日期格式设置({{ edu.start_date |date:"D, d M, Y" }}(

Django自定义模型字段的声音就是为此制作的:Django自定义模型字段。

我可以在自定义字段中做这样的事情:

def string_to_date(value):
value = '01/' + value
la_date = datetime.strptime(value, "%d/%m/%Y").date()
return la_date
def date_to_string(la_date_date):
la_date_str = la_date_date.strftime('%m/%Y')
return la_date_str
class DateYearMonth(models.DateField):
def get_prep_value(self, value):
if value is None:
return value
return string_to_date(value)
def to_python(self, value):
if value is None:
return value
return date_to_string(value)

关联的表单(我评论了小部件(:

class EducationForm(forms.ModelForm):
start_date =  forms.CharField()
end_date = forms.CharField()
class Meta:
model = Education
exclude = ("curriculum",)
#     # les widgets :
#       widgets = {
#          'start_date': forms.TextInput(),
#          'end_date': forms.TextInput(),
#     }

好吧,到目前为止这不起作用。但我什至不知道我是否朝着正确的方向前进......

编辑

实际上,也许我可以对月份和年份使用简单的 charfield 并添加一个模型方法,该方法将从中创建日期(也许是@property(......这样,我将在表单上保持简单,并能够在模板上格式化......

您可以将年份设置为整数字段和月份(CharField 或整数(,并单独存储月份中的年份可能是最好的解决方案。 下面是仅年份的示例(日期时间字段到年份字段的种类(

import datetime
YEAR_CHOICES = []
for r in range(1980, (datetime.datetime.now().year+1)):
YEAR_CHOICES.append((r,r))
year = models.IntegerField(_('year'), choices=YEAR_CHOICES, 
default=datetime.datetime.now().year)

最新更新