【问题标题】:How to represent two model fields as one form field in Django?如何在 Django 中将两个模型字段表示为一个表单字段?
【发布时间】:2012-03-09 03:46:18
【问题描述】:

我似乎无法弄清楚如何在 Django 中正确处理以下情况:

我在模型中有一个日期范围,我将其存储为两个单独的字段,date_startdate_end

start_date = models.DateTimeField()
end_date = models.DateTimeField()

在此模型的表单中,我想将其表示为一个字段,带有一个标签:

timespan = forms.Field(widget=widgets.SelectDateRangeWidget(), label="Date Range")

现在,我扩展了 MultiWidget 以创建 SelectDateRangeWidget

class SelectDateRangeWidget(forms.MultiWidget):
    ...

然后包含两个Date 小部件。我想使用它,但随后将其清理为两个单独的模型字段,并保留将初始数据加载到表单字段中的能力。是每次手动将initial设置为这两个字段的值的唯一方法,可能在表单的__init__函数中,并且还手动将其清理到这两个模型字段中,或者是否有清洁器(以便说话)怎么做?

【问题讨论】:

  • 我不明白问题出在哪里:提取您的两个日期,并将它们存储在模型中。
  • @marcin:我如何以一种有意义的方式将initial 值设置为两个模型字段的值,并且不会破坏 init 函数表格?我只是错过了一些明显的东西吗?
  • 给每个字段设置initial参数有什么问题?
  • @Marcin:这不是一个令人满意的解决方案,因为它将表单逻辑的关键部分放入视图中。或者,可以覆盖表单__init__ 函数来做到这一点,但仍然不是最好的。我认为可能有一个更清洁的解决方案,但我想答案是使用丑陋的解决方案并继续前进。
  • 它以什么方式将表单逻辑放入视图中?你在使用模型吗?如果没有,并且您有充分的理由不这样做,请将您的表单转换为模型表单,并引用目标模型对象。

标签: django django-forms django-multiwidget


【解决方案1】:

在 django 中使用当前的小部件 API 似乎是不可能的。该票是最古老的django票之一,已有7年历史:https://code.djangoproject.com/ticket/27.

您可以从模型表单中排除原始的 2 个字段,创建一个新字段并覆盖表单的保存方法。

【讨论】:

  • 谢谢!不敢相信我偶然发现了一个古老且仍未解决的请求
猜你喜欢
  • 2019-12-07
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多