Fixed ListField empty check which ignored multi-part list elements

This commit is contained in:
k.bar 2016-12-22 18:29:39 +01:00 committed by NeveHanter
parent 93fe531dea
commit 7f3fc41705
2 changed files with 10 additions and 4 deletions

View File

@ -1521,12 +1521,15 @@ class ListField(Field):
self.child.bind(field_name='', parent=self)
def get_value(self, dictionary):
if self.field_name not in dictionary:
if getattr(self.root, 'partial', False):
return empty
# We override the default field access in order to support
# lists in HTML forms.
if html.is_html_input(dictionary):
if getattr(self.root, 'partial', False):
if self.field_name not in dictionary:
regexp = re.compile(html.HTML_LIST_REGEXP_FORMAT % re.escape(self.field_name))
if not any(regexp.match(key) for key in dictionary.keys()):
return empty
val = dictionary.getlist(self.field_name, [])
if len(val) > 0:
# Support QueryDict lists in HTML input.

View File

@ -6,6 +6,9 @@ import re
from django.utils.datastructures import MultiValueDict
HTML_LIST_REGEXP_FORMAT = r'^%s\[([0-9]+)\](.*)$'
def is_html_input(dictionary):
# MultiDict type datastructures are used to represent HTML form input,
# which may have more than one value for each key.
@ -46,7 +49,7 @@ def parse_html_list(dictionary, prefix=''):
]
"""
ret = {}
regex = re.compile(r'^%s\[([0-9]+)\](.*)$' % re.escape(prefix))
regex = re.compile(HTML_LIST_REGEXP_FORMAT % re.escape(prefix))
for field, value in dictionary.items():
match = regex.match(field)
if not match: