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

标签 python django

我有一个表单允许用户记录他们的事件。为简单起见,假设我只有两个字段需要用户填写。

  • 时间
  • 行动

在一天中,用户可以填写多个时间 + Action 对。我在前端使用了 javascript 以允许用户根据需要添加这些对。

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

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

  • time_1: 9:50
  • action_1:唤醒
  • time_2: 11:00
  • aciton_2:锻炼
  • ...

然后,我从字典中减去每一对并将它们放入 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 方式”是什么?

谢谢!

最佳答案

Django 中有一个概念叫formset :

A formset is a layer of abstraction to work with multiple forms on the same page. It can be best compared to a data grid.

Django 的方式是使用 Model formsets :

Like regular formsets, Django provides a couple of enhanced formset classes that make it easy to work with Django models.

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

from django.forms.models import modelformset_factory

TimeActionFormset = modelformset_factory(TimeActionModel)

您可以在文档中阅读更多相关信息。它具有广泛的用例和示例来涵盖您的案例。

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

更新 2:字段的名称也取决于使用的 prefix,我建议在单个页面中有许多不同的表单/表单集的情况下使用它,但您可以很容易地推断出它Django 呈现的默认表单。

另外请不要忘记在您的模板中包含 {{ my_formset.management_form }}{{ my_formsets_form.id }}!

关于python - 在 Django 中处理动态生成表单的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30459008/

相关文章:

python - 如何在Python中按列分组并按自己的函数汇总

python - 设置色标以记录等值线图

python - 反向修补的 django-localeurl 在单元测试中不起作用

Django React Axios

Django 管理表单根据复选框动态更改字段

python - 将文件写入不存在的目录

python - 验证一对多模型。parent 不是 self

Python:编写单元测试失败了

python - 如何更改序列化的JSON结构djangorest框架

python - 搜索链接号码的循环