我有一个表单允许用户记录他们的事件。为简单起见,假设我只有两个字段需要用户填写。
- 时间
- 行动
在一天中,用户可以填写多个时间 + 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/