使用Django和JS的可变长度表单

时间:2012-05-26 16:00:26

标签: javascript django

我想创建一个包含多个textareas的表单。理想情况下,用户可以按页面上的按钮将另一个文本区添加到表单中。我已经让这个简单的部分使用了一小部分JS,但是我不知道如何处理提交这个表单并用Django存储结果 - 如果它总是有相同数量的textareas,那就是很容易,但我不知道如何使用变量编号。我的HTML看起来像这样:

<body>
    <form action="foo" method="post" id="survey_form">
      <input type="textarea" rows="4" cols="20">
    </form>
    <button onclick="addQuestion();">add question</button>
</body>

addQuestion()函数只是在表单中添加了另一个textarea输入:

function addQuestion() {
    var form = document.getElementById('survey_form');
    var new_text_area = document.createElement('input');
    new_text_area.setAttribute('type','textarea');
    new_text_area.setAttribute('rows', '4');
    new_text_area.setAttribute('cols', '20');
    form.appendChild(new_text_area);
}

我的Django模型有一个字符串列表的字段;这是正常的。现在的问题是如何从request.POST作为列表获取表单数据。我正在考虑给每个新的textarea提供自己的唯一标识符(textarea_1textarea_2等),然后循环并查看是否存在request.POST['textarea_' + str(i)],并将其添加到列表中字符串。然而,这似乎真的效率低下,并且引导起来非常难看。有更好的,更Pythonic的方式吗?

另外,我不完全确定如何给每个textarea一个唯一的标识符 - 我是JS的新手,而且我所有的知识都来自Google搜索。我正考虑在索引变量i上使用闭包,然后每次调用i时递增addQuestion()。这有意义吗?

最后,我们非常感谢指向JS为程序员提供快速启动的教程。

1 个答案:

答案 0 :(得分:3)

使用Formsets。它们允许您以一种形式编辑多个对象。理想情况下,您的formset将出现在Question类中。

从JS中,您可以添加名称为id_form-1-contentid_form-2-content等的新textareas。

in your view,你有类似的东西:

formset = QuestionFormSet(request.POST)
if formset.is_valid(): 
    # etc.