Python Durationfield django
Django 1.8中使用新DurationField的困难 对于Django的新款车型,我有点麻烦 我希望用户能够选择我的webapp上的事件持续时间是1天、3天还是5天,默认选择是3天 在我的模型开始时,我声明了以下选项:Python Durationfield django,python,django,django-forms,django-1.8,Python,Django,Django Forms,Django 1.8,Django 1.8中使用新DurationField的困难 对于Django的新款车型,我有点麻烦 我希望用户能够选择我的webapp上的事件持续时间是1天、3天还是5天,默认选择是3天 在我的模型开始时,我声明了以下选项: SHORT = datetime.timedelta(days=1) MEDIUM = datetime.timedelta(days=3) LONG = datetime.timedelta(days=5) DURATION_CHOICES = ((SHORT, '1
SHORT = datetime.timedelta(days=1)
MEDIUM = datetime.timedelta(days=3)
LONG = datetime.timedelta(days=5)
DURATION_CHOICES = ((SHORT, '1 day'),(MEDIUM, '3 days'), (LONG, '5 days'),)
然后,我在下面声明DurationField:
duration = models.DurationField(choices = DURATION_CHOICES, default = MEDIUM)
我为模型创建了一个ModelForm,并将其呈现在适当的模板上。在表单上,3天是下拉列表中的预选选项,1天和5天也是选项。但是,当我提交表单时,会出现表单验证错误,请选择有效选项。3天,0:00:00不是可用选项之一
但是,当我从DurationField中删除选项并保留默认值时:
duration = models.DurationField(default = MEDIUM)
我可以提交没有任何问题。我在这里做错了什么?在渲染或转换为模板时,模型选择选项没有给定timedelta字符串
以及模型字段
不工作
我用ChoiceField解决了这个问题
代码:
我不知道它是否不被推荐。。。我正在寻找django默认不工作的原因…也有同样的问题,这个问题在错误修复单中解释 解决此问题的最佳方法是在等待django团队解决此问题时使用此自定义字段:
"""
This is a temp DurationField with a bugfix
"""
standard_duration_re = re.compile(
r'^'
r'(?:(?P<days>-?\d+) (days, )?)?'
r'((?:(?P<hours>\d+):)(?=\d+:\d+))?'
r'(?:(?P<minutes>\d+):)?'
r'(?P<seconds>\d+)'
r'(?:\.(?P<microseconds>\d{1,6})\d{0,6})?'
r'$'
)
# Support the sections of ISO 8601 date representation that are accepted by
# timedelta
iso8601_duration_re = re.compile(
r'^P'
r'(?:(?P<days>\d+(.\d+)?)D)?'
r'(?:T'
r'(?:(?P<hours>\d+(.\d+)?)H)?'
r'(?:(?P<minutes>\d+(.\d+)?)M)?'
r'(?:(?P<seconds>\d+(.\d+)?)S)?'
r')?'
r'$'
)
def parse_duration(value):
"""Parses a duration string and returns a datetime.timedelta.
The preferred format for durations in Django is '%d %H:%M:%S.%f'.
Also supports ISO 8601 representation.
"""
match = standard_duration_re.match(value)
if not match:
match = iso8601_duration_re.match(value)
if match:
kw = match.groupdict()
if kw.get('microseconds'):
kw['microseconds'] = kw['microseconds'].ljust(6, '0')
kw = {k: float(v) for k, v in six.iteritems(kw) if v is not None}
return datetime.timedelta(**kw)
class DurationField(CoreDurationField):
def to_python(self, value):
if value is None:
return value
if isinstance(value, datetime.timedelta):
return value
try:
parsed = parse_duration(value)
except ValueError:
pass
else:
if parsed is not None:
return parsed
raise exceptions.ValidationError(
self.error_messages['invalid'],
code='invalid',
params={'value': value},
)
看起来那张票的地址是1.8.3
"""
This is a temp DurationField with a bugfix
"""
standard_duration_re = re.compile(
r'^'
r'(?:(?P<days>-?\d+) (days, )?)?'
r'((?:(?P<hours>\d+):)(?=\d+:\d+))?'
r'(?:(?P<minutes>\d+):)?'
r'(?P<seconds>\d+)'
r'(?:\.(?P<microseconds>\d{1,6})\d{0,6})?'
r'$'
)
# Support the sections of ISO 8601 date representation that are accepted by
# timedelta
iso8601_duration_re = re.compile(
r'^P'
r'(?:(?P<days>\d+(.\d+)?)D)?'
r'(?:T'
r'(?:(?P<hours>\d+(.\d+)?)H)?'
r'(?:(?P<minutes>\d+(.\d+)?)M)?'
r'(?:(?P<seconds>\d+(.\d+)?)S)?'
r')?'
r'$'
)
def parse_duration(value):
"""Parses a duration string and returns a datetime.timedelta.
The preferred format for durations in Django is '%d %H:%M:%S.%f'.
Also supports ISO 8601 representation.
"""
match = standard_duration_re.match(value)
if not match:
match = iso8601_duration_re.match(value)
if match:
kw = match.groupdict()
if kw.get('microseconds'):
kw['microseconds'] = kw['microseconds'].ljust(6, '0')
kw = {k: float(v) for k, v in six.iteritems(kw) if v is not None}
return datetime.timedelta(**kw)
class DurationField(CoreDurationField):
def to_python(self, value):
if value is None:
return value
if isinstance(value, datetime.timedelta):
return value
try:
parsed = parse_duration(value)
except ValueError:
pass
else:
if parsed is not None:
return parsed
raise exceptions.ValidationError(
self.error_messages['invalid'],
code='invalid',
params={'value': value},
)