【问题标题】:Django default form: populate some fields with values from last saved objectDjango默认表单:使用上次保存的对象的值填充一些字段
【发布时间】:2018-11-05 12:23:16
【问题描述】:

我正在使用 Django 记录游戏会话。例如,会话具有时间、地点、联赛和比赛。我可能需要一次录制许多玩过的游戏。我为会话创建了一个表单,我现在可以轻松地输入这些,一切都很好。

问题在于,所有比赛通常都在同一个联赛的同一个地方,例如大约在同一时间,所以我希望在保存一个表格后,呈现一个新的创建表格,其中地点、联赛和时间已经设置为合理的默认值(与上次保存的地点和联赛相同,可能相同的时间加上 90 分钟)。

我不确定解决此问题的最佳方法。会话数据存储似乎很有吸引力,但受到以下事实的限制:每个都需要 JSON 可序列化才能存储在那里。

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

{{ form.as_table }}

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

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

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

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

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

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    是的,覆盖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)
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-02
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多