【问题标题】:Django : Formset as form fieldDjango:作为表单字段的表单集
【发布时间】:2012-06-04 17:56:06
【问题描述】:

我需要的表单之一是简单字段(例如“Department”、“Building”和“RoomNumber”)和动态生成的字段对(例如“Name”和“Email”)的组合。理想情况下,编辑简单字段的内容和添加/删除动态字段对将在单个表单上完成。

代码方面,我想知道是否尝试将 Formset(具有两个动态字段的表单)作为普通表单中的字段嵌入是一种明智的方法,或者是否有另一种最佳实践来实现我想要的喜欢完成。

非常感谢您对这些问题的任何建议,

【问题讨论】:

  • 我们需要一些代码才能开始工作 =)

标签: django dynamic django-forms


【解决方案1】:

我不确定您需要“将 Formset 作为字段嵌入”的想法来自哪里;这听起来像是standard usage of formsets 的案例。

例如(对您的模型做出大量假设):

class OfficeForm(forms.Form):
  department = forms.ModelChoiceField(...
  room_number = forms.IntegerField(...

class StaffForm(forms.Form):
  name = forms.CharField(max_length=...
  email = forms.EmailField(...

from django.forms.formsets import formset_factory

StaffFormSet = formset_factory(StaffForm)

然后,在你看来:

def add_office(request):
    if request.method == 'POST':
        form = OfficeForm(request.POST)
        formset = StaffFormSet(request.POST)

        if form.is_valid() && formset.is_valid():
            # process form data
            # redirect to success page
    else:
        form = OfficeForm()
        formset = StaffFormSet()

    # render the form template with `form` and `formset` in the context dict

可能的改进:

  • 使用django-dynamic-formset jQuery plugin 获得可能需要的“向办公室添加任意数量的员工”功能,而无需每次都向用户显示一堆空白表格。
  • 改用model formsets(假设您收集的信息由 Django 模型支持),因此您不必显式指定字段名称或类型。

希望这会有所帮助。

【讨论】:

  • 感谢您指出这一点。我被以下事实误导了:我认为(谁知道为什么)如果 StaffFormSet 以某种方式声明为 OfficeForm 的一个字段会更实用。我会试试你的方法。
  • 我也错误地认为表单集应该是表单上的一个字段,但这个答案有帮助。为了增加答案,在您的模板中,您将在同一个 HTML form 标记内呈现 formformset。这样所有的表单数据都会在同一个 POST 中返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2016-12-20
  • 2019-03-10
  • 2019-09-24
  • 2013-04-03
  • 2023-04-01
相关资源
最近更新 更多