----------------编辑--------------------
我无法成功使用“自定义模型字段”进行操作,因此我不得不继续前进,所以实际上,我以本文结尾处指定的另一种方式进行了操作。
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)...这样,我可以在表单上保持简单并能够在模板上格式化...
答案 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)