【发布时间】:2018-06-26 19:52:26
【问题描述】:
我有一个 django 模板,我在其中动态呈现多个字段(使用 ajax)
下面是一个 Django 表单(已在模板中呈现),其字段具有相同的名称。我想使用cleaned_data 方法来清理views.py 中的表单数据,然后再将它们存储到数据库中。
index.html
<div class="form-container">
<!-- ASSUMING I HAVE ALREADY ADDED FIELDS DYNAMICALLY -->
<form id = "orderForm" action="newPickupOrder/" method="post" name="processForm">
<input type='text' name='this_field'>
<input type='text' name='this_field'>
<button type="submit">Submit</button>
</form>
</div>
<form id="addItemForm">
{% csrf_token %}
<!-- BUTTON TO ADD MORE FIELDS DYNAMICALLY -->
<button id = "addItemButton">Add item</button>
</form>
<script>
var addItemButton = document.querySelector('#addItemButton');
addItemButton.onclick = function(){
$.ajax({
type: 'POST',
url: 'addItem/',
data: addItemForm.serialize(),
success: function (response) {
$("#orderForm").append(response);
console.log('Success');
},
error: function (response) {
console.log('Error = '+response);
}
});
};
</script>
forms.py
class ItemForm(forms.Form):
this_field = forms.CharField()
urls.py
urlpatterns = [
url(r'^newPickupOrder/$', views.pickup_order_view, name='new_pickup_order'),
]
views.py
def add_item(request):
if request.method == 'POST':
itemForm = ItemForm()
return HttpResponse(itemForm.as_p())
def pickup_order_view(request):
if request.method == 'POST':
form = ItemForm(request.POST)
same_name_fields = request.POST.getlist('this_field')
# WANT TO CLEAN DATA IN same_name_fields
if form.is_valid():
print(form.cleaned_data)
# ONLY PRINTS THE LAST FIELD's DATA
return HttpResponseRedirect('/viewPickupRequests')
我面临的问题是,如果我使用form.cleaned_data['this_field'],则只会获取最后一个字段的数据,即在本例中,会获取并清理值为anotherTestValue 的字段。如果我使用request.POST.getlist('this_field') 获取数据,所有字段的数据都会被获取并存储为一个列表,但是,我不知道如何使用cleaned_data 方法来清理它。有没有办法将cleaned_data 方法应用于字段数据列表?
【问题讨论】:
-
你是如何在表单中声明这个字段的?
-
@PauloScardine 我已对问题进行了编辑,请立即查看
-
我认为您应该从 MultipleChoiceField 继承并禁用针对选择列表的验证才能完成此操作。不幸的是,我没有时间写一个正确的答案,对不起。
标签: python django forms django-forms django-views