我有一个表单,允许用户记录他们的活动。为简单起见,假设我只有两个字段,我希望用户填写。
在一天中,用户可以填写多个时间+动作对。我在前端使用了javascript,允许用户按照自己的意愿添加这些对。
因此,我不知道预先会有多少对。因此,我无法为它创建预定义的ModelForm。
为了解决这个问题,我用一个唯一的名称标记了每个时间和行动字段。因此,当我收到POST请求时,我在request.POST字典中列出了这样的列表:
然后,我从字典中减去每一对,并将它们放入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()
这是我的问题:
谢谢!
答案 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 }}
!