diff --git a/wagtail/wagtailadmin/blocks.py b/wagtail/wagtailadmin/blocks.py
index 6c27b4662..ef26655e5 100644
--- a/wagtail/wagtailadmin/blocks.py
+++ b/wagtail/wagtailadmin/blocks.py
@@ -780,7 +780,7 @@ class BaseStreamBlock(Block):
values_with_indexes.append(
(
- data['%s-%d-order' % (prefix, i)],
+ int(data['%s-%d-order' % (prefix, i)]),
block_type_name,
child_block.value_from_datadict(data, files, '%s-%d-value' % (prefix, i)),
)
diff --git a/wagtail/wagtailadmin/tests/test_blocks.py b/wagtail/wagtailadmin/tests/test_blocks.py
index 4a391808d..143106c0e 100644
--- a/wagtail/wagtailadmin/tests/test_blocks.py
+++ b/wagtail/wagtailadmin/tests/test_blocks.py
@@ -543,3 +543,36 @@ class TestStreamBlock(unittest.TestCase):
self.assertIn('', html)
self.assertIn('', html)
+
+ def test_ordering_in_form_submission(self):
+ class ArticleBlock(blocks.StreamBlock):
+ heading = blocks.CharBlock()
+ paragraph = blocks.CharBlock()
+
+ block = ArticleBlock()
+
+ # check that items are ordered by the 'order' field, not the order they appear in the form
+ post_data = {'article-count': '3'}
+ for i in range(0, 3):
+ post_data.update({
+ 'article-%d-deleted' % i: '',
+ 'article-%d-order' % i: str(2 - i),
+ 'article-%d-type' % i: 'heading',
+ 'article-%d-value' % i: "heading %d" % i
+ })
+
+ block_value = block.value_from_datadict(post_data, {}, 'article')
+ self.assertEqual(block_value[2].value, "heading 0")
+
+ # check that items are ordered by 'order' numerically, not alphabetically
+ post_data = {'article-count': '12'}
+ for i in range(0, 12):
+ post_data.update({
+ 'article-%d-deleted' % i: '',
+ 'article-%d-order' % i: str(i),
+ 'article-%d-type' % i: 'heading',
+ 'article-%d-value' % i: "heading %d" % i
+ })
+
+ block_value = block.value_from_datadict(post_data, {}, 'article')
+ self.assertEqual(block_value[2].value, "heading 2")