Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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(非模型)表单_Django_Django Forms - Fatal编程技术网

预填充Django(非模型)表单

预填充Django(非模型)表单,django,django-forms,Django,Django Forms,我试图根据一些信息在django表单中预填充数据,但不使用ModelForm,因此我不能只设置实例 这看起来应该很容易,但由于某些原因,我找不到任何文档来告诉我如何做。这是我的表格: class MyForm(forms.Form): charfield1 = forms.CharField(max_length=3) charfield2 = forms.CharField(max_length=3) choicefield = forms.ModelChoiceField(MyM

我试图根据一些信息在django表单中预填充数据,但不使用ModelForm,因此我不能只设置实例

这看起来应该很容易,但由于某些原因,我找不到任何文档来告诉我如何做。这是我的表格:

class MyForm(forms.Form):
  charfield1 = forms.CharField(max_length=3)
  charfield2 = forms.CharField(max_length=3)
  choicefield = forms.ModelChoiceField(MyModel.objects.all())
我试着做:

form = MyForm()
form.charfield1 = "foo"
form.charfield2 = "bar"
# a model choice field
form.choicefield = MyModel.objects.get(id=3)
这是行不通的

试试看:

form = MyForm({'charfield1': 'foo', 'charfield2': 'bar'})
表单
对象的构造函数可以使用字段值字典。这将创建一个绑定表单,该表单可用于验证数据并将表单呈现为HTML,并显示数据。有关更多详细信息,请参阅文档

编辑:

为完整起见,如果您不想绑定表单,而只想声明某些字段的初始值,则可以使用以下选项:

form = MyForm(initial={'charfield1': 'foo', 'charfield2': 'bar'})

有关详细信息,请参阅的文档。

有两种填充Django表单的方法

第一种方法是在实例化字典时将其作为第一个参数传递(或者将其作为
data
kwarg传递,这是相同的)。这是当您希望使用POST数据填充和验证表单时所做的操作

data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3}
form = MyForm(data_dict)
但是,这将触发表单上的验证,因此只有在实际传入有效且完整的数据时才有效,否则将以错误开始

填充表单的另一种方法是使用
initial
参数(文档化)。这将为表单字段提供初始值,但不会触发验证。例如,如果您没有填写所有值,那么它是合适的

form = MyForm(initial=data_dict)
要通过
initial
填充choicefield,请使用pk值

您可以使用model_to_dict()将实例转换为字典,然后用它填充表单。像这样的方法应该会奏效:

from django.forms.models import model_to_dict
...
my_obj = MyModel.objects.get(abc=123)
form = MyForm(initial=model_to_dict(my_obj))

注意:我正在使用django版本1.3,因为它的价值,
FormView
基于类的视图方法是覆盖
FormView
get_initial
函数
get_initial
返回
get_form_kwargs
用于实例化表单的初始关键字参数

data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3}
form = MyForm(data_dict)
文件:

  • 对于
    获取首字母
  • 对于
    获取表单\u kwargs
示例代码:

from django.views.generic.edit import FormView

class MyFormView(FormView):

    def get_initial(self):
        initial = super(MyFormView, self).get_initial()
        # update initial field defaults with custom set default values:
        initial.update({'charfield1': 'foo', 'charfield2': 'bar'})
        return initial

谢谢-这很有效。但是,它不适用于模型的外键。我尝试在字典中传入模型实例本身,这会引发异常,我尝试传入pk/id,虽然没有失败,但没有在表单UI中正确预加载。使用对象id应该可以。我刚刚用ModelChoiceField对它进行了测试。你能给我们看看你的表单定义吗?我又测试了一次。以下工作(2是模型中对象的id):MyForm({'charfield1':'foo','charfield2':'bar','choicefield':'2'})。您确定正在使用数据库中存在的id吗?目前我想不出还有什么其他原因会导致这种情况。这正是我一直在寻找的答案。谢谢基于上述内容,您如何向客户表单字段提供数据?@Chris,如果您有一个问题,但上面没有涉及,请打开一个新问题,在那里提问,并提供完整的细节。这是一个与此答案相关的附带问题。当焦点转移到字段时,初始值是否会消失?我这样问是因为如果您想用数据预填充或初始化字段,但允许用户在输入数据时附加到字段中,该怎么办?或者,更好的是,在某些情况下,强制用户追加(因为验证无论如何都需要初始值)?