以小时显示值,但在Django ModelForm中以分钟为单位存储

时间:2015-02-20 15:34:23

标签: django django-models django-forms

我在数据库中有一个列,以分钟为单位存储值。我想让用户编辑它,但是以小时为单位输入值。所以我需要在渲染表单时将值从几分钟转换为几小时,并在保存对象时将其转换回来。表单用于编辑对象,而不是创建。

这是我的解决方案:

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

有更好/更简单的方法吗?

0 个答案:

没有答案