|
@@ -1046,6 +1046,49 @@ class FormsTestCase(TestCase):
|
|
|
<tr><th>Field13:</th><td><input type="text" name="field13" /></td></tr>
|
|
|
<tr><th>Field14:</th><td><input type="text" name="field14" /></td></tr>""")
|
|
|
|
|
|
+ def test_explicit_field_order(self):
|
|
|
+ class TestFormParent(Form):
|
|
|
+ field1 = CharField()
|
|
|
+ field2 = CharField()
|
|
|
+ field4 = CharField()
|
|
|
+ field5 = CharField()
|
|
|
+ field6 = CharField()
|
|
|
+ field_order = ['field6', 'field5', 'field4', 'field2', 'field1']
|
|
|
+
|
|
|
+ class TestForm(TestFormParent):
|
|
|
+ field3 = CharField()
|
|
|
+ field_order = ['field2', 'field4', 'field3', 'field5', 'field6']
|
|
|
+
|
|
|
+ class TestFormRemove(TestForm):
|
|
|
+ field1 = None
|
|
|
+
|
|
|
+ class TestFormMissing(TestForm):
|
|
|
+ field_order = ['field2', 'field4', 'field3', 'field5', 'field6', 'field1']
|
|
|
+ field1 = None
|
|
|
+
|
|
|
+ class TestFormInit(TestFormParent):
|
|
|
+ field3 = CharField()
|
|
|
+ field_order = None
|
|
|
+
|
|
|
+ def __init__(self, **kwargs):
|
|
|
+ super(TestFormInit, self).__init__(**kwargs)
|
|
|
+ self.order_fields(field_order=TestForm.field_order)
|
|
|
+
|
|
|
+ p = TestFormParent()
|
|
|
+ self.assertEqual(list(p.fields.keys()), TestFormParent.field_order)
|
|
|
+ p = TestFormRemove()
|
|
|
+ self.assertEqual(list(p.fields.keys()), TestForm.field_order)
|
|
|
+ p = TestFormMissing()
|
|
|
+ self.assertEqual(list(p.fields.keys()), TestForm.field_order)
|
|
|
+ p = TestForm()
|
|
|
+ self.assertEqual(list(p.fields.keys()), TestFormMissing.field_order)
|
|
|
+ p = TestFormInit()
|
|
|
+ order = list(TestForm.field_order) + ['field1']
|
|
|
+ self.assertEqual(list(p.fields.keys()), order)
|
|
|
+ TestForm.field_order = ['unknown']
|
|
|
+ p = TestForm()
|
|
|
+ self.assertEqual(list(p.fields.keys()), ['field1', 'field2', 'field4', 'field5', 'field6', 'field3'])
|
|
|
+
|
|
|
def test_form_html_attributes(self):
|
|
|
# Some Field classes have an effect on the HTML attributes of their associated
|
|
|
# Widget. If you set max_length in a CharField and its associated widget is
|