Fixed #24788 -- Allowed Forms to specify a prefix at the class level.

This commit is contained in:
Paweł Marczewski 2015-05-24 20:43:20 +02:00 committed by Tim Graham
parent 4ccfc4439a
commit 4df7e8483b
4 changed files with 28 additions and 1 deletions

View File

@ -75,6 +75,7 @@ class BaseForm(object):
# information. Any improvements to the form API should be made to *this* # information. Any improvements to the form API should be made to *this*
# class, not to the Form class. # class, not to the Form class.
field_order = None field_order = None
prefix = None
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=None, initial=None, error_class=ErrorList, label_suffix=None,
@ -83,7 +84,8 @@ class BaseForm(object):
self.data = data or {} self.data = data or {}
self.files = files or {} self.files = files or {}
self.auto_id = auto_id self.auto_id = auto_id
self.prefix = prefix if prefix is not None:
self.prefix = prefix
self.initial = initial or {} self.initial = initial or {}
self.error_class = error_class self.error_class = error_class
# Translators: This is the default suffix added to form field labels # Translators: This is the default suffix added to form field labels

View File

@ -1065,3 +1065,13 @@ You can put several Django forms inside one ``<form>`` tag. To give each
>>> print(father.as_ul()) >>> print(father.as_ul())
<li><label for="id_father-first_name">First name:</label> <input type="text" name="father-first_name" id="id_father-first_name" /></li> <li><label for="id_father-first_name">First name:</label> <input type="text" name="father-first_name" id="id_father-first_name" /></li>
<li><label for="id_father-last_name">Last name:</label> <input type="text" name="father-last_name" id="id_father-last_name" /></li> <li><label for="id_father-last_name">Last name:</label> <input type="text" name="father-last_name" id="id_father-last_name" /></li>
The prefix can also be specified on the form class::
>>> class PersonForm(forms.Form):
... ...
... prefix = 'person'
.. versionadded:: 1.9
The ability to specify ``prefix`` on the form class was added.

View File

@ -161,6 +161,9 @@ Forms
:attr:`~django.forms.Form.field_order` attribute, the ``field_order`` :attr:`~django.forms.Form.field_order` attribute, the ``field_order``
constructor argument , or the :meth:`~django.forms.Form.order_fields` method. constructor argument , or the :meth:`~django.forms.Form.order_fields` method.
* A form prefix can be specified inside a form class, not only when
instantiating a form. See :ref:`form-prefix` for details.
Generic Views Generic Views
^^^^^^^^^^^^^ ^^^^^^^^^^^^^

View File

@ -1671,6 +1671,18 @@ class FormsTestCase(SimpleTestCase):
self.assertEqual(p.cleaned_data['last_name'], 'Lennon') self.assertEqual(p.cleaned_data['last_name'], 'Lennon')
self.assertEqual(p.cleaned_data['birthday'], datetime.date(1940, 10, 9)) self.assertEqual(p.cleaned_data['birthday'], datetime.date(1940, 10, 9))
def test_class_prefix(self):
# Prefix can be also specified at the class level.
class Person(Form):
first_name = CharField()
prefix = 'foo'
p = Person()
self.assertEqual(p.prefix, 'foo')
p = Person(prefix='bar')
self.assertEqual(p.prefix, 'bar')
def test_forms_with_null_boolean(self): def test_forms_with_null_boolean(self):
# NullBooleanField is a bit of a special case because its presentation (widget) # NullBooleanField is a bit of a special case because its presentation (widget)
# is different than its data. This is handled transparently, though. # is different than its data. This is handled transparently, though.