Django默认格式:使用最后保存的对象中的值填充某些字段

时间:2018-11-05 12:23:17

标签: django django-forms django-views

我正在使用Django记录游戏会话。会话包含时间,地点,联赛和比赛。一口气我可能需要录制许多玩过的游戏。我为会议创建了表格,现在我可以轻松输入这些内容,一切都很好。

问题在于,所有比赛通常都位于同一联赛中的同一地点,例如,大约在同一时间,所以我想在保存一种形式后,以一种新的创建形式呈现,其中地点,联赛和时间已经设置为明智的默认设置(与上次保存相同的地点和联赛,也许还有90分钟,但时间相同)。

我不确定解决此问题的最佳方法。会话数据存储看起来很吸引人,但由于其中的每一个都需要JSON可序列化才能存储在那里的事实而受到一定限制。

我在想也许我可以从数据库中提取信息,例如在视图的上下文中添加最后保存的此类对象的副本。但是以某种方式,我必须使用该上下文来填充默认值,该默认值仅在我的模板中为:

{{ form.as_table }}

我喜欢它是如此简单,如果不需要的话,我不想打破它并设计表格。有没有办法使它保持简单,并根据先前提交的内容查看各个字段的默认值?

我正在努力想出一种简单的方法。

由于这使我成为一个不太可能是新颖的用例,而其他人也可能已经解决了这个用例,因此我想先提出一个问题,然后再进行更深入的思考。

这是一个解决的问题吗?是否存在规范的Django方法来填充CreateView类生成的默认表单? UpdateView使用提供给它的实例的字段填充相同的默认表单。并且CreateView遵守模型定义中指定的默认值。但是是否有一种规范的方法可以部分使用在加载时确定的默认值填充CreateView。

我怀疑这将需要从CreateView派生一个新类并覆盖get_initial()。但是我似乎找不到关于它的清晰文档或好的示例,并且如前所述,想知道这是否不是规范解决方案可以解决的问题。

1 个答案:

答案 0 :(得分:0)

是的,重写get_initial完全是正确的事情。例如:

class CreateNewSession(views.CreateView):
    model = Session
    ....

    def get_initial(self):
        last = Session.objects.order_by('-created')[0]
        return {
            'place': last.place,
            'league': last.league,
            'time': last.time + datetime.timedelta(minutes=90)
        }