我想创建一个包含多个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_1
,textarea_2
等),然后循环并查看是否存在request.POST['textarea_' + str(i)]
,并将其添加到列表中字符串。然而,这似乎真的效率低下,并且引导起来非常难看。有更好的,更Pythonic的方式吗?
另外,我不完全确定如何给每个textarea一个唯一的标识符 - 我是JS的新手,而且我所有的知识都来自Google搜索。我正考虑在索引变量i
上使用闭包,然后每次调用i
时递增addQuestion()
。这有意义吗?
最后,我们非常感谢指向JS为程序员提供快速启动的教程。
答案 0 :(得分:3)
使用Formsets。它们允许您以一种形式编辑多个对象。理想情况下,您的formset将出现在Question类中。
从JS中,您可以添加名称为id_form-1-content
,id_form-2-content
等的新textareas。
in your view,你有类似的东西:
formset = QuestionFormSet(request.POST)
if formset.is_valid():
# etc.