Django自定义字段用于仅使用月份和年份来处理日期字段

时间:2018-09-03 16:10:21

标签: django django-models datefield

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

我无法成功使用“自定义模型字段”进行操作,因此我不得不继续前进,所以实际上,我以本文结尾处指定的另一种方式进行了操作。

Here is a link to a new post exposing the solution.

---------------- END EDIT --------------------

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

日期只能是月份和年份(“%m /%Y”)。

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

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

我知道,我可以简单地使用表单charfield数月,而使用另一个表单数年。

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

Django custom model fields为此发出的声音:Django custom model fields

我可以在自定义字段中执行以下操作:

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)...这样,我可以在表单上保持简单并能够在模板上格式化...

1 个答案:

答案 0 :(得分:0)

您可以将Year设置为IntegerField和Month(CharField或Integer),然后将Year分别存储在Months中可能是最好的解决方案。 以下是仅适用于Year的示例(DatetimeField的类型为YearField)

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)