Author: jacob
Date: 2008-08-28 15:58:10 -0500 (Thu, 28 Aug 2008)
New Revision: 8682

Modified:
   django/trunk/django/contrib/admin/options.py
   django/trunk/django/contrib/admin/widgets.py
   django/trunk/django/db/models/fields/__init__.py
   django/trunk/tests/modeltests/model_forms/models.py
Log:
Fixed #8556: added a useful formfield to `CommaSeparatedIntegerField`. gkelly, 
mattmcc, and kratorius all contributed portions of this patch.

Modified: django/trunk/django/contrib/admin/options.py
===================================================================
--- django/trunk/django/contrib/admin/options.py        2008-08-28 20:48:59 UTC 
(rev 8681)
+++ django/trunk/django/contrib/admin/options.py        2008-08-28 20:58:10 UTC 
(rev 8682)
@@ -94,6 +94,11 @@
             kwargs['widget'] = widgets.AdminIntegerFieldWidget
             return db_field.formfield(**kwargs)
 
+        # For CommaSeparatedIntegerFields, add a custom CSS class.
+        if isinstance(db_field, models.CommaSeparatedIntegerField):
+            kwargs['widget'] = widgets.AdminCommaSeparatedIntegerFieldWidget
+            return db_field.formfield(**kwargs)
+
         # For TextInputs, add a custom CSS class.
         if isinstance(db_field, models.CharField):
             kwargs['widget'] = widgets.AdminTextInputWidget

Modified: django/trunk/django/contrib/admin/widgets.py
===================================================================
--- django/trunk/django/contrib/admin/widgets.py        2008-08-28 20:48:59 UTC 
(rev 8681)
+++ django/trunk/django/contrib/admin/widgets.py        2008-08-28 20:58:10 UTC 
(rev 8682)
@@ -236,3 +236,10 @@
         if attrs is not None:
             final_attrs.update(attrs)
         super(AdminIntegerFieldWidget, self).__init__(attrs=final_attrs)
+
+class AdminCommaSeparatedIntegerFieldWidget(forms.TextInput):
+    def __init__(self, attrs=None):
+        final_attrs = {'class': 'vCommaSeparatedIntegerField'}
+        if attrs is not None:
+            final_attrs.update(attrs)
+        super(AdminCommaSeparatedIntegerFieldWidget, 
self).__init__(attrs=final_attrs)

Modified: django/trunk/django/db/models/fields/__init__.py
===================================================================
--- django/trunk/django/db/models/fields/__init__.py    2008-08-28 20:48:59 UTC 
(rev 8681)
+++ django/trunk/django/db/models/fields/__init__.py    2008-08-28 20:58:10 UTC 
(rev 8682)
@@ -394,7 +394,17 @@
 
 # TODO: Maybe move this into contrib, because it's specialized.
 class CommaSeparatedIntegerField(CharField):
-    pass
+    def formfield(self, **kwargs):
+        defaults = {
+            'form_class': forms.RegexField,
+            'regex': '^[\d,]+$',
+            'max_length': self.max_length,
+            'error_messages': {
+                'invalid': _(u'Enter only digits separated by commas.'),
+            }
+        }
+        defaults.update(kwargs)
+        return super(CommaSeparatedIntegerField, self).formfield(**defaults)
 
 ansi_date_re = re.compile(r'^\d{4}-\d{1,2}-\d{1,2}$')
 

Modified: django/trunk/tests/modeltests/model_forms/models.py
===================================================================
--- django/trunk/tests/modeltests/model_forms/models.py 2008-08-28 20:48:59 UTC 
(rev 8681)
+++ django/trunk/tests/modeltests/model_forms/models.py 2008-08-28 20:58:10 UTC 
(rev 8682)
@@ -98,6 +98,12 @@
     def __unicode__(self):
         return self.description
 
+class CommaSeparatedInteger(models.Model):
+    field = models.CommaSeparatedIntegerField(max_length=20)
+
+    def __unicode__(self):
+        return self.field
+
 __test__ = {'API_TESTS': """
 >>> from django import forms
 >>> from django.forms.models import ModelForm, model_to_dict
@@ -1050,4 +1056,30 @@
 <link href="/some/form/css" type="text/css" media="all" rel="stylesheet" />
 <script type="text/javascript" src="/some/form/javascript"></script>
 
+>>> class CommaSeparatedIntegerForm(ModelForm):
+...    class Meta:
+...        model = CommaSeparatedInteger
+
+>>> f = CommaSeparatedIntegerForm().fields['field']
+>>> f.clean('1,2,3')
+u'1,2,3'
+>>> f.clean('1a,2')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter only digits separated by commas.']
+>>> f.clean(',,,,') 
+u',,,,'
+>>> f.clean('1.2')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter only digits separated by commas.']
+>>> f.clean('1,a,2')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter only digits separated by commas.']
+>>> f.clean('1,,2')
+u'1,,2'
+>>> f.clean('1')
+u'1'
+
 """}


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to