Index: __init__.py
===================================================================
--- __init__.py	(revision 4358)
+++ __init__.py	(working copy)
@@ -337,7 +337,10 @@
     def formfield(self, initial=None):
         "Returns a django.newforms.Field instance for this database Field."
         # TODO: This is just a temporary default during development.
-        return forms.CharField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:
+            return forms.CharField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
 
     def value_from_object(self, obj):
         "Returns the value of this field in the given model instance."
@@ -397,7 +400,10 @@
         return [oldforms.CheckboxField]
 
     def formfield(self, initial=None):
-        return forms.BooleanField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:        
+            return forms.BooleanField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
 
 class CharField(Field):
     def get_manipulator_field_objs(self):
@@ -414,7 +420,10 @@
         return str(value)
 
     def formfield(self, initial=None):
-        return forms.CharField(max_length=self.maxlength, required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:        
+            return forms.CharField(max_length=self.maxlength, required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
 
 # TODO: Maybe move this into contrib, because it's specialized.
 class CommaSeparatedIntegerField(CharField):
@@ -488,7 +497,10 @@
         return {self.attname: (val is not None and val.strftime("%Y-%m-%d") or '')}
 
     def formfield(self, initial=None):
-        return forms.DateField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:        
+            return forms.DateField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
 
 class DateTimeField(DateField):
     def to_python(self, value):
@@ -549,7 +561,10 @@
                 time_field: (val is not None and val.strftime("%H:%M:%S") or '')}
 
     def formfield(self, initial=None):
-        return forms.DateTimeField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:        
+            return forms.DateTimeField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
 
 class EmailField(CharField):
     def __init__(self, *args, **kwargs):
@@ -566,7 +581,10 @@
         validators.isValidEmail(field_data, all_data)
 
     def formfield(self, initial=None):
-        return forms.EmailField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:        
+            return forms.EmailField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
 
 class FileField(Field):
     def __init__(self, verbose_name=None, name=None, upload_to='', **kwargs):
@@ -701,7 +719,10 @@
         return [oldforms.IntegerField]
 
     def formfield(self, initial=None):
-        return forms.IntegerField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:        
+            return forms.IntegerField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
 
 class IPAddressField(Field):
     def __init__(self, *args, **kwargs):
@@ -758,7 +779,10 @@
         return [oldforms.LargeTextField]
 
     def formfield(self, initial=None):
-        return forms.CharField(required=not self.blank, widget=forms.Textarea, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:        
+            return forms.CharField(required=not self.blank, widget=forms.Textarea, label=capfirst(self.verbose_name), initial=initial)
 
 class TimeField(Field):
     empty_strings_allowed = False
@@ -801,7 +825,10 @@
         return {self.attname: (val is not None and val.strftime("%H:%M:%S") or '')}
 
     def formfield(self, initial=None):
-        return forms.TimeField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:        
+            return forms.TimeField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial)
 
 class URLField(CharField):
     def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
@@ -818,7 +845,10 @@
         return "CharField"
 
     def formfield(self, initial=None):
-        return forms.URLField(required=not self.blank, verify_exists=self.verify_exists, label=capfirst(self.verbose_name), initial=initial)
+        if self.choices:
+            return forms.ChoiceField(required=not self.blank, label=capfirst(self.verbose_name), initial=initial, choices=self.choices)
+        else:        
+            return forms.URLField(required=not self.blank, verify_exists=self.verify_exists, label=capfirst(self.verbose_name), initial=initial)
 
 class USStateField(Field):
     def get_manipulator_field_objs(self):
