Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ModelForm ChoiceField不显示实例数据_Django_Django Forms - Fatal编程技术网

Django ModelForm ChoiceField不显示实例数据

Django ModelForm ChoiceField不显示实例数据,django,django-forms,Django,Django Forms,我有一个ModelForm类,在该类中我将两个字段设置为ChoiceField。对于我的一个视图,我想从我的ModelForm类中创建一个表单,该类从数据库中的模型实例中提取(如下所示): 当我这样做,然后在模板中呈现表单时,我注意到大多数字段都预先填充了从模型实例中提取的值,这就是我想要的。但是,对于两个ChoiceField字段,情况并非如此。这些渲染为下拉选择菜单,未选择特定选项 奇怪的是,如果我没有在ModelForm类中将这两个字段定义为ChoiceField-type,它们将以HTM

我有一个
ModelForm
类,在该类中我将两个字段设置为
ChoiceField
。对于我的一个视图,我想从我的
ModelForm
类中创建一个表单,该类从数据库中的模型实例中提取(如下所示):

当我这样做,然后在模板中呈现表单时,我注意到大多数字段都预先填充了从模型实例中提取的值,这就是我想要的。但是,对于两个
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时预先选择了模型实例值。我想知道在模型定义中使用
选项
参数是否会造成差异

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

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

我得到的值类似于
datetime.time(12,0)
。但是在Django管理员中,当我查看所有
应用程序
实例时,它们都在
开始时间
结束时间
下显示
(无)
。为什么会这样?

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

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

如果你把你的时间换成

    (datetime.time(0,0),u'All Day'),
    (datetime.time(12,0),u'Noon')
你的麻烦应该结束了


Alan

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

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

如果你把你的时间换成

    (datetime.time(0,0),u'All Day'),
    (datetime.time(12,0),u'Noon')
你的麻烦应该结束了


Alan

可能是的副本和更多副本。请将代码发布到您的模型和表单中。谢谢。@Hedde,不希望有默认的选择选项。我希望所选选项来自对象实例。您会注意到,我实际上在另一个问题的已接受答案下方发布了一条注释,这正是因为它对我不起作用。要定义动态初始值,请覆盖表单的init方法,以通过给定实例设置默认值value@Hedde,谢谢你的建议。我编辑了我的问题以包含我的模型和表单的代码,现在我想知道为什么实例值显示在我表单的
code
字段中,而不显示在其他两个字段中。可能重复或更多。您能将代码发布到您的模型和表单中吗。谢谢。@Hedde,不希望有默认的选择选项。我希望所选选项来自对象实例。您会注意到,我实际上在另一个问题的已接受答案下方发布了一条注释,这正是因为它对我不起作用。要定义动态初始值,请覆盖表单的init方法,以通过给定实例设置默认值value@Hedde,谢谢你的建议。我编辑了我的问题以包含我的模型和表单的代码,现在我想知道为什么实例值显示在我表单的
code
字段中,而不显示在其他两个字段中。嗨,艾伦,谢谢你的回答,我实际上在看到你的回答之前就得出了相同的结论(我实际上是回来“回答”我自己的问题!)。有趣的是,我在处理这个问题时发现,如果在模型定义中创建一组使用时间字符串表示的
选项
,则在试图将其中一个值保存到表单中时会抛出错误(当上述
AppForm
定义中提供了
选项时,它没有这样做)。但最奇怪的是,它在尝试保存
'00:00'
时没有抛出错误,只有
12:00
。如果您在表单中提供选项,那么您可能应该使用forms.TypedChoiceField,并将参数“强制”设置为datetime.time。这应该可以修复该错误。嗨,Alan,感谢您的回答,我实际上使用了相同的c结论就在我看到你的回答之前(实际上我回来是为了“回答”我自己的问题!)。有趣的是,我在处理问题时发现,如果在模型定义中创建一组使用时间字符串表示的
选项
,则在尝试将其中一个值保存到表单中时会抛出错误(当上述
AppForm
定义中提供了
选项时,它没有这样做)。但最奇怪的是,它在尝试保存
'00:00'
时没有抛出错误,只有
12:00
。如果在表单中提供选项,则可能应该使用forms.TypedChoiceField,并将参数“强制”设置为datetime.time。这应该可以修复该错误。