自定义时间小部件的问题

0 投票
1 回答
539 浏览
提问于 2025-04-16 15:27

我有一个模型,它里面有一个属性,用来表示这个对象什么时候不再公开可用。

class Story(models.Model):
    ...
    deadline = models.models.DateTimeField()

我想给用户一个简单的方式来设置这个日期,但又要限制选择。我会提供1到7天的“有效期”选择。所以我现在做的是设置一个自定义表单,像这样:

DAYS_CHOICES = (
    ('1', '1 day'),
    ...
    ('7', '7 days'),
)

class StoryForm(ModelForm):
    fecha_cierre = forms.TypedChoiceField(
       choices=DAYS_CHOICES, widget=forms.Select)

class Meta:
    models = Story

问题是‘1’或‘7’并不是日期时间对象,我其实不知道在哪里可以拦截表单提交的过程,这样我就可以把值改成像这样的:

datetime.datetime.now() + datetime.timedelta(days=n_days)).strftime('%Y-%m-%d %H:%M:%S')

在这种情况下,最好的处理方式是什么呢?

1 个回答

1

你需要把表单中的 deadline 字段去掉,并且重写 save() 方法:

class StoryForm(ModelForm):

    fecha_cierre = forms.TypedChoiceField(
       choices=DAYS_CHOICES, widget=forms.Select)

    class Meta:
        models = Story
        exclude = ('deadline',)

    def save(self):
        story = super(StoryForm, self).save(commit=False)
        story.deadline = datetime.datetime.now() + \
                         datetime.timedelta(days=self.cleaned_data['fecha_cierre']))
        story.save()
        return story

撰写回答