我在数据库中有一个列,以分钟为单位存储值。我想让用户编辑它,但是以小时为单位输入值。所以我需要在渲染表单时将值从几分钟转换为几小时,并在保存对象时将其转换回来。表单用于编辑对象,而不是创建。
这是我的解决方案:
class Profile(models.Model):
user = models.OneToOneField(User)
time_zone = models.CharField(verbose_name=_("Time zone"),
choices=[(tz, tz) for tz in pytz.common_timezones],
default='Europe/Kiev',
max_length=50)
learning_time = models.PositiveIntegerField(verbose_name=_("Learning time"), default=30, validators=[
MinValueValidator(30),
MaxValueValidator(480),
])
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('time_zone',)
def __init__(self, *args, **kwargs):
super(ProfileForm, self).__init__(*args, **kwargs)
initial_learning_time = kwargs.get('initial') and kwargs['initial'].get('learning_time')
self.fields['learning_time'].initial = initial_learning_time or kwargs['instance'].learning_time / 60.0
learning_time = forms.DecimalField(min_value=0.5, max_value=8, widget=forms.NumberInput(attrs={'step': 0.5}),
label=_("Daily learning time (hours)"))
def save(self, commit=True):
profile = super(ProfileForm, self).save(commit)
profile.learning_time = self.cleaned_data['learning_time'] * 60
if commit:
profile.save()
return profile
有更好/更简单的方法吗?