在Django中处理动态生成表单的更好方法

时间:2015-05-26 12:46:13

标签: python django

我有一个表单,允许用户记录他们的活动。为简单起见,假设我只有两个字段,我希望用户填写。

  • 时间
  • 动作

在一天中,用户可以填写多个时间+动作对。我在前端使用了javascript,允许用户按照自己的意愿添加这些对。

因此,我不知道预先会有多少对。因此,我无法为它创建预定义的ModelForm。

为了解决这个问题,我用一个唯一的名称标记了每个时间和行动字段。因此,当我收到POST请求时,我在request.POST字典中列出了这样的列表:

  • time_1:9:50
  • action_1:wakeup
  • time_2:11:00
  • aciton_2:exercise
  • ...

然后,我从字典中减去每一对,并将它们放入ModelForm进行验证并保存到数据库中。

class TimeActionModel(Model):
    time = DateField()
    action = CharField(max_length=100)

class TimeActionForm(ModelForm):
    class Meta:
        model = TimeActionModel

class TimeActionView(View):
    def post(self, request, *args, **kwargs):
        self._subtract_and_save(request)

    def _subtract_and_save(request):
        #loop through the request.POST dictionary
            #pull out each pair
            #stuff each one into a ModelForm object
            if form.is_valid():
                form.save()

这是我的问题:

  • 这种做法对你来说是否合适?
  • 处理这种情况的'Django方式'是什么?

谢谢!

1 个答案:

答案 0 :(得分:4)

Django中有一个名为formset的概念:

  

formset是一个抽象层,可以在同一页面上使用多个表单。它最好与数据网格进行比较。

Django的方式是使用Model formsets

  

与常规表单集一样,Django提供了一些增强的表单集类,可以轻松使用Django模型。

因此,您可以为TimeActionModel创建一个模型表单集:

from django.forms.models import modelformset_factory

TimeActionFormset = modelformset_factory(TimeActionModel)

您可以在文档中阅读更多相关内容。它有大量的用例和示例来涵盖您的案例。

更新:formset的extras参数不是很重要。您可以轻松地操作formset with a bit of javascript中的额外表单数量。还有一些贡献包,例如django-dynamic-formset

UPDATE2:字段的名称取决于所使用的prefix,如果单个页面中有许多不同的表单/表单集,我建议使用它,但您可以轻松地推断出它看到的默认表单Django呈现。

另外,请不要忘记在模板中忘记{{ my_formset.management_form }}{{ my_formsets_form.id }}

相关问题