ModelForm 中的 DurationField 格式
DurationField format in a ModelForm
我有一个包含持续时间字段的 Django 模型:
class Entry(models.Model):
duration = models.DurationField()
我想使用 ModelForm 为这个模型渲染一个表单:
class EditEntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['duration']
一切正常。但是,如果编辑现有模型,文本框中呈现的持续时间格式为 HH:MM:SS
我永远不会处理超过一个小时的持续时间。如何更改 Django 在表单中将此字段格式化为 MM:SS
?
我在渲染模型时已经使用了自定义模板过滤器,只是不知道如何更改表单的渲染方式。
谢谢
您应该可以通过为字段提供自定义小部件来做到这一点:
from django.forms.widgets import TextInput
from django.utils.dateparse import parse_duration
class DurationInput(TextInput):
def _format_value(self, value):
duration = parse_duration(value)
seconds = duration.seconds
minutes = seconds // 60
seconds = seconds % 60
minutes = minutes % 60
return '{:02d}:{:02d}'.format(minutes, seconds)
然后您在字段中指定此小部件:
class EditEntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['duration']
widgets = {
'duration': DurationInput()
}
当然,如果您提供的持续时间超过一个小时,这将导致奇怪...
在我的例子中,我需要删除毫秒,所以我按照 MichaelM 的建议做了
# -*- coding: utf-8 -*-
import datetime
from django import forms
from harvests.models import Harvest
def duration_string(duration):
# Removing the milliseconds of the duration field
days = duration.days
seconds = duration.seconds
microseconds = duration.microseconds
minutes = seconds // 60
seconds = seconds % 60
hours = minutes // 60
minutes = minutes % 60
string = '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
if days:
string = '{} '.format(days) + string
# if microseconds:
# string += '.{:06d}'.format(microseconds)
return string
class CustomDurationField(forms.DurationField):
def prepare_value(self, value):
if isinstance(value, datetime.timedelta):
return duration_string(value)
return value
class HarvestForm(forms.ModelForm):
work_time_interval = CustomDurationField()
class Meta:
model = Harvest
fields = '__all__'
我有一个包含持续时间字段的 Django 模型:
class Entry(models.Model):
duration = models.DurationField()
我想使用 ModelForm 为这个模型渲染一个表单:
class EditEntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['duration']
一切正常。但是,如果编辑现有模型,文本框中呈现的持续时间格式为 HH:MM:SS
我永远不会处理超过一个小时的持续时间。如何更改 Django 在表单中将此字段格式化为 MM:SS
?
我在渲染模型时已经使用了自定义模板过滤器,只是不知道如何更改表单的渲染方式。
谢谢
您应该可以通过为字段提供自定义小部件来做到这一点:
from django.forms.widgets import TextInput
from django.utils.dateparse import parse_duration
class DurationInput(TextInput):
def _format_value(self, value):
duration = parse_duration(value)
seconds = duration.seconds
minutes = seconds // 60
seconds = seconds % 60
minutes = minutes % 60
return '{:02d}:{:02d}'.format(minutes, seconds)
然后您在字段中指定此小部件:
class EditEntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['duration']
widgets = {
'duration': DurationInput()
}
当然,如果您提供的持续时间超过一个小时,这将导致奇怪...
在我的例子中,我需要删除毫秒,所以我按照 MichaelM 的建议做了
# -*- coding: utf-8 -*-
import datetime
from django import forms
from harvests.models import Harvest
def duration_string(duration):
# Removing the milliseconds of the duration field
days = duration.days
seconds = duration.seconds
microseconds = duration.microseconds
minutes = seconds // 60
seconds = seconds % 60
hours = minutes // 60
minutes = minutes % 60
string = '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
if days:
string = '{} '.format(days) + string
# if microseconds:
# string += '.{:06d}'.format(microseconds)
return string
class CustomDurationField(forms.DurationField):
def prepare_value(self, value):
if isinstance(value, datetime.timedelta):
return duration_string(value)
return value
class HarvestForm(forms.ModelForm):
work_time_interval = CustomDurationField()
class Meta:
model = Harvest
fields = '__all__'