【问题标题】:Django ModelForm ChoiceField not displaying instance dataDjango ModelForm ChoiceField 不显示实例数据
【发布时间】:2013-04-09 23:30:37
【问题描述】:

我有一个ModelForm 类,在其中我将几个字段设置为ChoiceField。对于我的一个观点,我想从我的 ModelForm 类中创建一个表单,该表单从数据库中我的模型实例中提取(就像这样):

form = MyModel(instance=model_instance)

当我这样做然后在模板中呈现表单时,我注意到大多数字段都预先填充了从模型实例中提取的值,这正是我想要的。但是,这不是两个 ChoiceField 字段的情况。这些呈现为没有选择特定选项的下拉选择菜单。

奇怪的是,如果我没有在我的 ModelForm 类中将这两个字段定义为 ChoiceField-type,它们会呈现为 HTML 中的普通文本输入字段,并使用数据库值进行预填充。但是当我定义它们以使它们在 HTML 中显示为选择选项输入字段时,没有预先选择任何内容。我可以更改它以便预先选择数据库中的值吗?

编辑:这里要求的是我的模型和表格的代码:

class App(models.Model):
    CODES = (
        (u'a',u'annual'),
        (u'm',u'monthly'),
        (u'w',u'weekly')
    )
    code = models.CharField(max_length=1, choices=CODES)
    start_time = models.TimeField(blank=True, null=True)
    end_time = models.TimeField(blank=True, null=True)


class AppForm(ModelForm):
    CODES = (
        (u'',u'Please select code'),
        (u'a',u'annual'),
        (u'm',u'monthly'),
        (u'w',u'weekly')
    )
    TIMES = (
        (u'00:00',u'All Day'),
        (u'12:00',u'Noon')
    )
    start_time = forms.ChoiceField(required=False, choices=TIMES)
    end_time = forms.ChoiceField(required=False, choices=TIMES)
    code = forms.ChoiceField(choices=CODES, label='Type')

    class Meta:
        model = App

有趣的是,code 字段在呈现为 HTML 时预先选择了模型实例值。我想知道在模型定义中使用 choices 参数是否会有所不同?

更新:我刚刚注意到,如果我在 python manage.py shell 中拉出一个 App 实例,如下所示:

a = App.objects.get(id=16)
a.start_time

我得到一个像datetime.time(12, 0) 这样的值。但是在 Django 管理员中,当我查看所有App 实例时,它们都在start_timeend_time 下显示(None)。为什么会这样?

【问题讨论】:

  • 您能否将代码发布到您的模型和表单中。谢谢。
  • @Hedde,不希望有默认选择选项。我希望所选选项来自对象实例。您会注意到我实际上在另一个问题的已接受答案下方发表了评论,正是因为它对我不起作用。
  • 定义一个动态初始值覆盖表单的init方法,通过给定的实例值设置默认值
  • @Hedde,谢谢你的建议。我编辑了我的问题以包含我的模型和表单的代码,现在我想知道为什么实例值显示在我的表单的 code 字段中而不是其他两个字段中。

标签: django django-forms


【解决方案1】:

响应您的更新:您的时间字符串与默认时间字符串 HH:MM 格式匹配。就像用户会在 12:00 手动从网站输入它们一样。这些值在模型保存时被解析并转换为时间(在真正验证时)。

当您加载模型时,从对象加载的初始值当然与字段的 (models.TimeField) 类型相匹配。

如果您将 TIMES 替换为

    (datetime.time(0,0),u'All Day'),
    (datetime.time(12,0),u'Noon')

你的麻烦应该已经结束了。

艾伦

【讨论】:

  • 嗨艾伦,谢谢你的回答,实际上我在看到你的回复之前就得出了同样的结论(我实际上是回来“回答”我自己的问题!)。有趣的是,我在摆弄这个问题时发现的一件事是,如果您在使用字符串表示时间的模型定义中创建一组CHOICES,则在尝试将其中一个值保存在表单中时会引发错误(当上面的AppForm 定义中提供了CHOICES 时,它没有这样做)。但最奇怪的是,它在尝试保存'00:00'时并没有报错,只有12:00
  • 如果您在表单中提供选择,那么您可能应该使用 forms.TypedChoiceField 并将参数 'coerce' 设置为 datetime.time docs.djangoproject.com/en/dev/ref/forms/fields/…。这应该可以解决该错误。
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2014-04-05
  • 2018-06-25
  • 1970-01-01
相关资源
最近更新 更多