Django:Formset作为表单字段

Mar*_*ark 12 django dynamic django-forms

我需要的其中一种形式是简单字段(比如"Department","Building"和"RoomNumber")的组合,以及动态生成的字段对(比如"Name"和"Email").理想情况下,编辑简单字段的内容以及添加/删除动态字段对将在单个表单上完成.

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

非常感谢有关这些问题的任何建议,

sup*_*cuo 16

我不确定你需要"将Formset作为一个字段嵌入"的想法来自哪里; 这听起来像是模板集标准用法.

例如(对您的模型做出一系列假设):

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)
Run Code Online (Sandbox Code Playgroud)

然后,为了您的观点:

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
Run Code Online (Sandbox Code Playgroud)

可能的改进:

  • 使用django-dynamic-formset jQuery插件可以获得可能需要的"向办公室添加任意数量的人员"功能,而不会每次向用户显示一堆空白表单.
  • 使用模型表单集(假设您收集的信息由Django模型支持),因此您不必显式指定字段名称或类型.

希望这可以帮助.

  • 感谢您指出了这一点。我被以下事实误导了:我认为(谁知道为什么),如果将“StaffFormSet”以某种方式声明为“OfficeForm”的字段,将会更实用。我会尝试一下你的方法。 (2认同)