Ticket #5986: django-fields-order.3.patch

File django-fields-order.3.patch, 5.6 KB (added by Patryk Zawadzki <patrys@…>, 16 years ago)

Added support for form_for_model

  • django/newforms/forms.py

     
    88from django.utils.html import escape
    99from django.utils.encoding import StrAndUnicode, smart_unicode, force_unicode
    1010from django.utils.safestring import mark_safe
     11from django.core.management.base import CommandError
    1112
    1213from fields import Field
    1314from widgets import TextInput, Textarea
     
    3839            if hasattr(base, 'base_fields'):
    3940                fields = base.base_fields.items() + fields
    4041
     42        # If this class is created by form_for_instance or form_for_model
     43        # base_fields are passed in attrs
     44        if attrs.has_key('base_fields'):
     45            fields = attrs['base_fields'].items() + fields
     46
     47        # Sort by Meta.fields_order if present.
     48        # Raises CommandError if any of the fields is missing.
     49        if attrs.has_key('Meta') and hasattr(attrs['Meta'], 'fields_order'):
     50            for f in fields:
     51                if not f[0] in attrs['Meta'].fields_order:
     52                    raise CommandError, "%s not present in %s.Meta.fields_order" % (f[0], name)
     53            fields.sort(lambda x, y: cmp(attrs['Meta'].fields_order.index(x[0]), attrs['Meta'].fields_order.index(y[0])))
     54
    4155        attrs['base_fields'] = SortedDict(fields)
    4256        return type.__new__(cls, name, bases, attrs)
    4357
  • tests/regressiontests/forms/fields_order.py

     
     1# -*- coding: utf-8 -*-
     2
     3tests = r"""
     4>>> from django.newforms import *
     5>>> class TestForm(Form):
     6...     f1=CharField(max_length=10)
     7>>> TestForm(auto_id=False).as_p()
     8u'<p>F1: <input type="text" name="f1" maxlength="10" /></p>'
     9>>> class TestForm(Form):
     10...     f1=CharField(max_length=10)
     11...     class Meta:
     12...         fields_order=['baz']
     13Traceback (most recent call last):
     14...
     15CommandError: f1 not present in TestForm.Meta.fields_order
     16>>> class TestForm(Form):
     17...     f1=CharField(max_length=10)
     18...     f2=CharField(max_length=10)
     19...     class Meta:
     20...         fields_order=['f1']
     21Traceback (most recent call last):
     22...
     23CommandError: f2 not present in TestForm.Meta.fields_order
     24>>> class TestForm(Form):
     25...     f1=CharField(max_length=10)
     26...     class Meta:
     27...         fields_order=['f1']
     28>>> TestForm(auto_id=False).as_p()
     29u'<p>F1: <input type="text" name="f1" maxlength="10" /></p>'
     30>>> class TestForm(Form):
     31...     f1=CharField(max_length=10)
     32...     f2=CharField(max_length=10)
     33...     class Meta:
     34...         fields_order=['f1','f2']
     35>>> TestForm(auto_id=False).as_p()
     36u'<p>F1: <input type="text" name="f1" maxlength="10" /></p>\n<p>F2: <input type="text" name="f2" maxlength="10" /></p>'
     37>>> class TestForm(Form):
     38...     f1=CharField(max_length=10)
     39...     f2=CharField(max_length=10)
     40...     class Meta:
     41...         fields_order=['f2','f1']
     42>>> TestForm(auto_id=False).as_p()
     43u'<p>F2: <input type="text" name="f2" maxlength="10" /></p>\n<p>F1: <input type="text" name="f1" maxlength="10" /></p>'
     44>>> class SomeForm(TestForm):
     45...     f3=CharField(max_length=10)
     46>>> TestForm(auto_id=False).as_p()
     47u'<p>F2: <input type="text" name="f2" maxlength="10" /></p>\n<p>F1: <input type="text" name="f1" maxlength="10" /></p>'
     48>>> SomeForm(auto_id=False).as_p()
     49u'<p>F2: <input type="text" name="f2" maxlength="10" /></p>\n<p>F1: <input type="text" name="f1" maxlength="10" /></p>\n<p>F3: <input type="text" name="f3" maxlength="10" /></p>'
     50>>> class SomeForm(TestForm):
     51...     f3=CharField(max_length=10)
     52...     class Meta:
     53...         fields_order=['f3']
     54Traceback (most recent call last):
     55...
     56CommandError: f2 not present in SomeForm.Meta.fields_order
     57>>> class SomeForm(TestForm):
     58...     f3=CharField(max_length=10)
     59...     class Meta:
     60...         fields_order=['f3','f2','f1']
     61>>> SomeForm(auto_id=False).as_p()
     62u'<p>F3: <input type="text" name="f3" maxlength="10" /></p>\n<p>F2: <input type="text" name="f2" maxlength="10" /></p>\n<p>F1: <input type="text" name="f1" maxlength="10" /></p>'
     63>>> from django.contrib.admin.models import User
     64>>> SomeForm = form_for_model(User, Form, fields = ['username'])
     65>>> class TestForm(SomeForm):
     66...     f1 = CharField(max_length=10)
     67...     class Meta:
     68...         fields_order=['f1','username']
     69>>> TestForm(auto_id=False).as_p()
     70u'<p>F1: <input type="text" name="f1" maxlength="10" /></p>\n<p>Username: <input type="text" name="username" maxlength="30" /> Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores).</p>'
     71"""
  • tests/regressiontests/forms/tests.py

     
    22from extra import tests as extra_tests
    33from fields import tests as fields_tests
    44from forms import tests as form_tests
     5from fields_order import tests as fields_order_tests
    56from error_messages import tests as custom_error_message_tests
    67from localflavor.ar import tests as localflavor_ar_tests
    78from localflavor.au import tests as localflavor_au_tests
     
    2930__test__ = {
    3031    'extra_tests': extra_tests,
    3132    'fields_tests': fields_tests,
     33    'fields_order_test': fields_order_tests,
    3234    'form_tests': form_tests,
    3335    'custom_error_message_tests': custom_error_message_tests,
    3436    'localflavor_ar_tests': localflavor_ar_tests,
Back to Top