Django : set default value for formset_factory form element

标签 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()

最佳答案

您想使用modelformset_factory ,它专为创建模型实例的表单集并对其进行操作而定制。

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.objects.all()。此外,您还将拥有空白表单,允许您创建新的模型实例。空白表单的数量取决于传递给 modelformset_factory() 的 max_numextra kwargs。

如果您需要初始数据,可以在生成表单集时使用 initial kwarg 指定它。请注意,初始数据需要位于列表内。

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

这应该看起来像你想要的。但是,您无法(至少在当前的 Django 版本中)使用现有模型实例和额外表单的初始数据创建模型表单集。这就是objects.none() 查询集存在的原因。将其设置为objects.all() 或删除queryset kwarg,并且 - 如果您有实例 - 额外的表单将没有初始数据。

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

关于Django : set default value for formset_factory form element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174617/

相关文章:

python - 如何自定义选择器中的默认 <option>

python - 查询集对象没有属性 'Name'

python - 在 Django 中启动项目后,我应该将项目文件移动到父目录吗?

django - 在具有两个 View 的一个页面中处理多个 Django 表单的正确方法?

Django formset - 只有在没有初始数据集时才显示额外的字段?

python - Django - 表 xxx 没有名为 xxx 的列

python - 创建一个只显示(不可编辑)的 Django 管理字段

python - Django 排队存储 [Errno 13] 权限被拒绝

django - 使用 get_object_or_404 时无法解压不可迭代的 int obj

django - 显示 Django 表单错误消息而不仅仅是字段名称