django:设置formset_factory表单元素的默认值

时间:2011-08-24 11:21:41

标签: django django-forms

型号:

class AssociatedFileCourse(models.Model)
  file_original = models.FileField(upload_to = 'assets/associated_files')
  session = models.ForeignKey(Session)
  title = models.CharField(max_length=500)

形式:

class AddAssociatedFilesForm(ModelForm):
  class Meta:
    model = AssociatedFileCourse

如果我必须从上面的定义中创建一个单独的表格并设置一些初始值,那么可以使用像

这样的初始参数

form = AddAssociatedFilesForm(initial={'session': Session.objects.get(pk=id)})

在创建formset_factory表单时如何设置初始表单值:

AddAssociatedFilesFormSet = formset_factory(AddAssociatedFilesForm)
form = AddAssociatedFilesFormSet()

2 个答案:

答案 0 :(得分:1)

除非使用字典中的值列表而不仅仅是值,否则您将以相同的方式执行此操作。

来自Django docs on formsets

>>> ArticleFormSet = formset_factory(ArticleForm, extra=2)
>>> formset = ArticleFormSet(initial=[
...     {'title': u'Django is now open source',
...      'pub_date': datetime.date.today()},
... ])

>>> for form in formset:
...     print form.as_table()
<tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Django is now open source" id="id_form-0-title" /></td></tr>
<tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-12" id="id_form-0-pub_date" /></td></tr>
<tr><th><label for="id_form-1-title">Title:</label></th><td><input type="text" name="form-1-title" id="id_form-1-title" /></td></tr>
<tr><th><label for="id_form-1-pub_date">Pub date:</label></th><td><input type="text" name="form-1-pub_date" id="id_form-1-pub_date" /></td></tr>
<tr><th><label for="id_form-2-title">Title:</label></th><td><input type="text" name="form-2-title" id="id_form-2-title" /></td></tr>
<tr><th><label for="id_form-2-pub_date">Pub date:</label></th><td><input type="text" name="form-2-pub_date" id="id_form-2-pub_date" /></td></tr>

答案 1 :(得分:1)

您想使用modelformset_factory,它是专门为模型实例的模板集创建和操作的。{/ p>

from django.forms.models import modelformset_factory

# create the formset by specifying the Model and Form to use
AddAssociatedFilesFormSet = modelformset_factory(AssociatedFileCourse, form=AddAssociatedFilesForm)

# Because you aren't doing anything special with your custom form,
# you don't even need to define your own Form class
AddAssociatedFilesFormSet = modelformset_factory(AssociatedFileCourse)

默认情况下,Model formset将为每个Model实例显示一个表单 - 即Model.objects.all()。此外,您将拥有允许您创建新模型实例的空白表单。空白表单的数量取决于传递给modelformset_factory()的max_numextra个kwargs。

如果您想要初始数据,可以在生成formset时使用initial kwarg指定它。注意,初始数据需要在列表中。

formset = AddAssociatedFilesFormSet(queryset=AssociatedFileCourse.objects.none(),
                                    initial=[{'session': Session.objects.get(pk=id)}])

这应该看起来像你想要它。但是,您不能(至少在当前的Django版本中)使用现有的Model实例 extra表单的初始数据创建一个Model formset。这就是为什么objects.none()查询集存在的原因。将它设置为objects.all()或删除queryset kwarg,如果有实例,则额外的表单将不具有初始数据。

进一步阅读带有初始数据的模型表格集 - 请参阅此post