web/lib/django/db/models/fields/__init__.py
changeset 29 cc9b7e14412b
parent 0 0d40e90630ef
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
     1 import copy
       
     2 import datetime
     1 import datetime
     3 import os
     2 import decimal
     4 import re
     3 import re
     5 import time
     4 import time
     6 try:
     5 import math
     7     import decimal
     6 from itertools import tee
     8 except ImportError:
     7 
     9     from django.utils import _decimal as decimal    # for Python 2.3
     8 import django.utils.copycompat as copy
    10 
     9 
    11 from django.db import connection
    10 from django.db import connection
    12 from django.db.models import signals
    11 from django.db.models.fields.subclassing import LegacyConnection
    13 from django.db.models.query_utils import QueryWrapper
    12 from django.db.models.query_utils import QueryWrapper
    14 from django.dispatch import dispatcher
       
    15 from django.conf import settings
    13 from django.conf import settings
    16 from django import forms
    14 from django import forms
    17 from django.core import exceptions
    15 from django.core import exceptions, validators
    18 from django.utils.datastructures import DictWrapper
    16 from django.utils.datastructures import DictWrapper
    19 from django.utils.functional import curry
    17 from django.utils.functional import curry
    20 from django.utils.itercompat import tee
       
    21 from django.utils.text import capfirst
    18 from django.utils.text import capfirst
    22 from django.utils.translation import ugettext_lazy, ugettext as _
    19 from django.utils.translation import ugettext_lazy as _
    23 from django.utils.encoding import smart_unicode, force_unicode, smart_str
    20 from django.utils.encoding import smart_unicode, force_unicode, smart_str
    24 from django.utils import datetime_safe
    21 from django.utils import datetime_safe
    25 
    22 
    26 class NOT_PROVIDED:
    23 class NOT_PROVIDED:
    27     pass
    24     pass
    47 # attname. For example, this gets the primary key value of object "obj":
    44 # attname. For example, this gets the primary key value of object "obj":
    48 #
    45 #
    49 #     getattr(obj, opts.pk.attname)
    46 #     getattr(obj, opts.pk.attname)
    50 
    47 
    51 class Field(object):
    48 class Field(object):
       
    49     """Base class for all field types"""
       
    50     __metaclass__ = LegacyConnection
       
    51 
    52     # Designates whether empty strings fundamentally are allowed at the
    52     # Designates whether empty strings fundamentally are allowed at the
    53     # database level.
    53     # database level.
    54     empty_strings_allowed = True
    54     empty_strings_allowed = True
    55 
    55 
    56     # These track each time a Field instance is created. Used to retain order.
    56     # These track each time a Field instance is created. Used to retain order.
    57     # The auto_creation_counter is used for fields that Django implicitly
    57     # The auto_creation_counter is used for fields that Django implicitly
    58     # creates, creation_counter is used for all user-specified fields.
    58     # creates, creation_counter is used for all user-specified fields.
    59     creation_counter = 0
    59     creation_counter = 0
    60     auto_creation_counter = -1
    60     auto_creation_counter = -1
       
    61     default_validators = [] # Default set of validators
       
    62     default_error_messages = {
       
    63         'invalid_choice': _(u'Value %r is not a valid choice.'),
       
    64         'null': _(u'This field cannot be null.'),
       
    65         'blank': _(u'This field cannot be blank.'),
       
    66     }
       
    67 
       
    68     # Generic field type description, usually overriden by subclasses
       
    69     def _description(self):
       
    70         return _(u'Field of type: %(field_type)s') % {
       
    71             'field_type': self.__class__.__name__
       
    72         }
       
    73     description = property(_description)
    61 
    74 
    62     def __init__(self, verbose_name=None, name=None, primary_key=False,
    75     def __init__(self, verbose_name=None, name=None, primary_key=False,
    63             max_length=None, unique=False, blank=False, null=False,
    76             max_length=None, unique=False, blank=False, null=False,
    64             db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
    77             db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
    65             serialize=True, unique_for_date=None, unique_for_month=None,
    78             serialize=True, unique_for_date=None, unique_for_month=None,
    66             unique_for_year=None, choices=None, help_text='', db_column=None,
    79             unique_for_year=None, choices=None, help_text='', db_column=None,
    67             db_tablespace=None, auto_created=False):
    80             db_tablespace=None, auto_created=False, validators=[],
       
    81             error_messages=None):
    68         self.name = name
    82         self.name = name
    69         self.verbose_name = verbose_name
    83         self.verbose_name = verbose_name
    70         self.primary_key = primary_key
    84         self.primary_key = primary_key
    71         self.max_length, self._unique = max_length, unique
    85         self.max_length, self._unique = max_length, unique
    72         self.blank, self.null = blank, null
    86         self.blank, self.null = blank, null
    95             Field.auto_creation_counter -= 1
   109             Field.auto_creation_counter -= 1
    96         else:
   110         else:
    97             self.creation_counter = Field.creation_counter
   111             self.creation_counter = Field.creation_counter
    98             Field.creation_counter += 1
   112             Field.creation_counter += 1
    99 
   113 
       
   114         self.validators = self.default_validators + validators
       
   115 
       
   116         messages = {}
       
   117         for c in reversed(self.__class__.__mro__):
       
   118             messages.update(getattr(c, 'default_error_messages', {}))
       
   119         messages.update(error_messages or {})
       
   120         self.error_messages = messages
       
   121 
   100     def __cmp__(self, other):
   122     def __cmp__(self, other):
   101         # This is needed because bisect does not take a comparison function.
   123         # This is needed because bisect does not take a comparison function.
   102         return cmp(self.creation_counter, other.creation_counter)
   124         return cmp(self.creation_counter, other.creation_counter)
   103 
   125 
   104     def __deepcopy__(self, memodict):
   126     def __deepcopy__(self, memodict):
   116         django.core.exceptions.ValidationError if the data can't be converted.
   138         django.core.exceptions.ValidationError if the data can't be converted.
   117         Returns the converted value. Subclasses should override this.
   139         Returns the converted value. Subclasses should override this.
   118         """
   140         """
   119         return value
   141         return value
   120 
   142 
   121     def db_type(self):
   143     def run_validators(self, value):
   122         """
   144         if value in validators.EMPTY_VALUES:
   123         Returns the database column data type for this field, taking into
   145             return
   124         account the DATABASE_ENGINE setting.
   146 
       
   147         errors = []
       
   148         for v in self.validators:
       
   149             try:
       
   150                 v(value)
       
   151             except exceptions.ValidationError, e:
       
   152                 if hasattr(e, 'code') and e.code in self.error_messages:
       
   153                     message = self.error_messages[e.code]
       
   154                     if e.params:
       
   155                         message = message % e.params
       
   156                     errors.append(message)
       
   157                 else:
       
   158                     errors.extend(e.messages)
       
   159         if errors:
       
   160             raise exceptions.ValidationError(errors)
       
   161 
       
   162     def validate(self, value, model_instance):
       
   163         """
       
   164         Validates value and throws ValidationError. Subclasses should override
       
   165         this to provide validation logic.
       
   166         """
       
   167         if not self.editable:
       
   168             # Skip validation for non-editable fields.
       
   169             return
       
   170         if self._choices and value:
       
   171             for option_key, option_value in self.choices:
       
   172                 if isinstance(option_value, (list, tuple)):
       
   173                     # This is an optgroup, so look inside the group for options.
       
   174                     for optgroup_key, optgroup_value in option_value:
       
   175                         if value == optgroup_key:
       
   176                             return
       
   177                 elif value == option_key:
       
   178                     return
       
   179             raise exceptions.ValidationError(self.error_messages['invalid_choice'] % value)
       
   180 
       
   181         if value is None and not self.null:
       
   182             raise exceptions.ValidationError(self.error_messages['null'])
       
   183 
       
   184         if not self.blank and value in validators.EMPTY_VALUES:
       
   185             raise exceptions.ValidationError(self.error_messages['blank'])
       
   186 
       
   187     def clean(self, value, model_instance):
       
   188         """
       
   189         Convert the value's type and run validation. Validation errors from to_python
       
   190         and validate are propagated. The correct value is returned if no error is
       
   191         raised.
       
   192         """
       
   193         value = self.to_python(value)
       
   194         self.validate(value, model_instance)
       
   195         self.run_validators(value)
       
   196         return value
       
   197 
       
   198     def db_type(self, connection):
       
   199         """
       
   200         Returns the database column data type for this field, for the provided
       
   201         connection.
   125         """
   202         """
   126         # The default implementation of this method looks at the
   203         # The default implementation of this method looks at the
   127         # backend-specific DATA_TYPES dictionary, looking up the field by its
   204         # backend-specific DATA_TYPES dictionary, looking up the field by its
   128         # "internal type".
   205         # "internal type".
   129         #
   206         #
   154         if self.verbose_name is None and name:
   231         if self.verbose_name is None and name:
   155             self.verbose_name = name.replace('_', ' ')
   232             self.verbose_name = name.replace('_', ' ')
   156 
   233 
   157     def contribute_to_class(self, cls, name):
   234     def contribute_to_class(self, cls, name):
   158         self.set_attributes_from_name(name)
   235         self.set_attributes_from_name(name)
       
   236         self.model = cls
   159         cls._meta.add_field(self)
   237         cls._meta.add_field(self)
   160         if self.choices:
   238         if self.choices:
   161             setattr(cls, 'get_%s_display' % self.name, curry(cls._get_FIELD_display, field=self))
   239             setattr(cls, 'get_%s_display' % self.name, curry(cls._get_FIELD_display, field=self))
   162 
   240 
   163     def get_attname(self):
   241     def get_attname(self):
   176 
   254 
   177     def pre_save(self, model_instance, add):
   255     def pre_save(self, model_instance, add):
   178         "Returns field's value just before saving."
   256         "Returns field's value just before saving."
   179         return getattr(model_instance, self.attname)
   257         return getattr(model_instance, self.attname)
   180 
   258 
   181     def get_db_prep_value(self, value):
   259     def get_prep_value(self, value):
       
   260         "Perform preliminary non-db specific value checks and conversions."
       
   261         return value
       
   262 
       
   263     def get_db_prep_value(self, value, connection, prepared=False):
   182         """Returns field's value prepared for interacting with the database
   264         """Returns field's value prepared for interacting with the database
   183         backend.
   265         backend.
   184 
   266 
   185         Used by the default implementations of ``get_db_prep_save``and
   267         Used by the default implementations of ``get_db_prep_save``and
   186         `get_db_prep_lookup```
   268         `get_db_prep_lookup```
   187         """
   269         """
       
   270         if not prepared:
       
   271             value = self.get_prep_value(value)
   188         return value
   272         return value
   189 
   273 
   190     def get_db_prep_save(self, value):
   274     def get_db_prep_save(self, value, connection):
   191         "Returns field's value prepared for saving into a database."
   275         "Returns field's value prepared for saving into a database."
   192         return self.get_db_prep_value(value)
   276         return self.get_db_prep_value(value, connection=connection, prepared=False)
   193 
   277 
   194     def get_db_prep_lookup(self, lookup_type, value):
   278     def get_prep_lookup(self, lookup_type, value):
       
   279         "Perform preliminary non-db specific lookup checks and conversions"
       
   280         if hasattr(value, 'prepare'):
       
   281             return value.prepare()
       
   282         if hasattr(value, '_prepare'):
       
   283             return value._prepare()
       
   284 
       
   285         if lookup_type in (
       
   286                 'regex', 'iregex', 'month', 'day', 'week_day', 'search',
       
   287                 'contains', 'icontains', 'iexact', 'startswith', 'istartswith',
       
   288                 'endswith', 'iendswith', 'isnull'
       
   289             ):
       
   290             return value
       
   291         elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
       
   292             return self.get_prep_value(value)
       
   293         elif lookup_type in ('range', 'in'):
       
   294             return [self.get_prep_value(v) for v in value]
       
   295         elif lookup_type == 'year':
       
   296             try:
       
   297                 return int(value)
       
   298             except ValueError:
       
   299                 raise ValueError("The __year lookup type requires an integer argument")
       
   300 
       
   301         raise TypeError("Field has invalid lookup: %s" % lookup_type)
       
   302 
       
   303     def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False):
   195         "Returns field's value prepared for database lookup."
   304         "Returns field's value prepared for database lookup."
       
   305         if not prepared:
       
   306             value = self.get_prep_lookup(lookup_type, value)
       
   307         if hasattr(value, 'get_compiler'):
       
   308             value = value.get_compiler(connection=connection)
   196         if hasattr(value, 'as_sql') or hasattr(value, '_as_sql'):
   309         if hasattr(value, 'as_sql') or hasattr(value, '_as_sql'):
   197             # If the value has a relabel_aliases method, it will need to
   310             # If the value has a relabel_aliases method, it will need to
   198             # be invoked before the final SQL is evaluated
   311             # be invoked before the final SQL is evaluated
   199             if hasattr(value, 'relabel_aliases'):
   312             if hasattr(value, 'relabel_aliases'):
   200                 return value
   313                 return value
   201             if hasattr(value, 'as_sql'):
   314             if hasattr(value, 'as_sql'):
   202                 sql, params = value.as_sql()
   315                 sql, params = value.as_sql()
   203             else:
   316             else:
   204                 sql, params = value._as_sql()
   317                 sql, params = value._as_sql(connection=connection)
   205             return QueryWrapper(('(%s)' % sql), params)
   318             return QueryWrapper(('(%s)' % sql), params)
   206 
   319 
   207         if lookup_type in ('regex', 'iregex', 'month', 'day', 'week_day', 'search'):
   320         if lookup_type in ('regex', 'iregex', 'month', 'day', 'week_day', 'search'):
   208             return [value]
   321             return [value]
   209         elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
   322         elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
   210             return [self.get_db_prep_value(value)]
   323             return [self.get_db_prep_value(value, connection=connection, prepared=prepared)]
   211         elif lookup_type in ('range', 'in'):
   324         elif lookup_type in ('range', 'in'):
   212             return [self.get_db_prep_value(v) for v in value]
   325             return [self.get_db_prep_value(v, connection=connection, prepared=prepared) for v in value]
   213         elif lookup_type in ('contains', 'icontains'):
   326         elif lookup_type in ('contains', 'icontains'):
   214             return ["%%%s%%" % connection.ops.prep_for_like_query(value)]
   327             return ["%%%s%%" % connection.ops.prep_for_like_query(value)]
   215         elif lookup_type == 'iexact':
   328         elif lookup_type == 'iexact':
   216             return [connection.ops.prep_for_iexact_query(value)]
   329             return [connection.ops.prep_for_iexact_query(value)]
   217         elif lookup_type in ('startswith', 'istartswith'):
   330         elif lookup_type in ('startswith', 'istartswith'):
   219         elif lookup_type in ('endswith', 'iendswith'):
   332         elif lookup_type in ('endswith', 'iendswith'):
   220             return ["%%%s" % connection.ops.prep_for_like_query(value)]
   333             return ["%%%s" % connection.ops.prep_for_like_query(value)]
   221         elif lookup_type == 'isnull':
   334         elif lookup_type == 'isnull':
   222             return []
   335             return []
   223         elif lookup_type == 'year':
   336         elif lookup_type == 'year':
   224             try:
       
   225                 value = int(value)
       
   226             except ValueError:
       
   227                 raise ValueError("The __year lookup type requires an integer argument")
       
   228 
       
   229             if self.get_internal_type() == 'DateField':
   337             if self.get_internal_type() == 'DateField':
   230                 return connection.ops.year_lookup_bounds_for_date_field(value)
   338                 return connection.ops.year_lookup_bounds_for_date_field(value)
   231             else:
   339             else:
   232                 return connection.ops.year_lookup_bounds(value)
   340                 return connection.ops.year_lookup_bounds(value)
   233 
       
   234         raise TypeError("Field has invalid lookup: %s" % lookup_type)
       
   235 
   341 
   236     def has_default(self):
   342     def has_default(self):
   237         "Returns a boolean of whether this field has a default value."
   343         "Returns a boolean of whether this field has a default value."
   238         return self.default is not NOT_PROVIDED
   344         return self.default is not NOT_PROVIDED
   239 
   345 
   270         "Returns flattened choices with a default blank choice included."
   376         "Returns flattened choices with a default blank choice included."
   271         first_choice = include_blank and blank_choice or []
   377         first_choice = include_blank and blank_choice or []
   272         return first_choice + list(self.flatchoices)
   378         return first_choice + list(self.flatchoices)
   273 
   379 
   274     def _get_val_from_obj(self, obj):
   380     def _get_val_from_obj(self, obj):
   275         if obj:
   381         if obj is not None:
   276             return getattr(obj, self.attname)
   382             return getattr(obj, self.attname)
   277         else:
   383         else:
   278             return self.get_default()
   384             return self.get_default()
   279 
   385 
   280     def value_to_string(self, obj):
   386     def value_to_string(self, obj):
   297 
   403 
   298     def _get_flatchoices(self):
   404     def _get_flatchoices(self):
   299         """Flattened version of choices tuple."""
   405         """Flattened version of choices tuple."""
   300         flat = []
   406         flat = []
   301         for choice, value in self.choices:
   407         for choice, value in self.choices:
   302             if type(value) in (list, tuple):
   408             if isinstance(value, (list, tuple)):
   303                 flat.extend(value)
   409                 flat.extend(value)
   304             else:
   410             else:
   305                 flat.append((choice,value))
   411                 flat.append((choice,value))
   306         return flat
   412         return flat
   307     flatchoices = property(_get_flatchoices)
   413     flatchoices = property(_get_flatchoices)
   311 
   417 
   312     def formfield(self, form_class=forms.CharField, **kwargs):
   418     def formfield(self, form_class=forms.CharField, **kwargs):
   313         "Returns a django.forms.Field instance for this database Field."
   419         "Returns a django.forms.Field instance for this database Field."
   314         defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
   420         defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
   315         if self.has_default():
   421         if self.has_default():
   316             defaults['initial'] = self.get_default()
       
   317             if callable(self.default):
   422             if callable(self.default):
       
   423                 defaults['initial'] = self.default
   318                 defaults['show_hidden_initial'] = True
   424                 defaults['show_hidden_initial'] = True
       
   425             else:
       
   426                 defaults['initial'] = self.get_default()
   319         if self.choices:
   427         if self.choices:
   320             # Fields with choices get special treatment.
   428             # Fields with choices get special treatment.
   321             include_blank = self.blank or not (self.has_default() or 'initial' in kwargs)
   429             include_blank = self.blank or not (self.has_default() or 'initial' in kwargs)
   322             defaults['choices'] = self.get_choices(include_blank=include_blank)
   430             defaults['choices'] = self.get_choices(include_blank=include_blank)
   323             defaults['coerce'] = self.to_python
   431             defaults['coerce'] = self.to_python
   328             # max_value) don't apply for choice fields, so be sure to only pass
   436             # max_value) don't apply for choice fields, so be sure to only pass
   329             # the values that TypedChoiceField will understand.
   437             # the values that TypedChoiceField will understand.
   330             for k in kwargs.keys():
   438             for k in kwargs.keys():
   331                 if k not in ('coerce', 'empty_value', 'choices', 'required',
   439                 if k not in ('coerce', 'empty_value', 'choices', 'required',
   332                              'widget', 'label', 'initial', 'help_text',
   440                              'widget', 'label', 'initial', 'help_text',
   333                              'error_messages'):
   441                              'error_messages', 'show_hidden_initial'):
   334                     del kwargs[k]
   442                     del kwargs[k]
   335         defaults.update(kwargs)
   443         defaults.update(kwargs)
   336         return form_class(**defaults)
   444         return form_class(**defaults)
   337 
   445 
   338     def value_from_object(self, obj):
   446     def value_from_object(self, obj):
   339         "Returns the value of this field in the given model instance."
   447         "Returns the value of this field in the given model instance."
   340         return getattr(obj, self.attname)
   448         return getattr(obj, self.attname)
   341 
   449 
   342 class AutoField(Field):
   450 class AutoField(Field):
       
   451     description = _("Integer")
       
   452 
   343     empty_strings_allowed = False
   453     empty_strings_allowed = False
       
   454     default_error_messages = {
       
   455         'invalid': _(u'This value must be an integer.'),
       
   456     }
   344     def __init__(self, *args, **kwargs):
   457     def __init__(self, *args, **kwargs):
   345         assert kwargs.get('primary_key', False) is True, "%ss must have primary_key=True." % self.__class__.__name__
   458         assert kwargs.get('primary_key', False) is True, "%ss must have primary_key=True." % self.__class__.__name__
   346         kwargs['blank'] = True
   459         kwargs['blank'] = True
   347         Field.__init__(self, *args, **kwargs)
   460         Field.__init__(self, *args, **kwargs)
   348 
   461 
   350         if value is None:
   463         if value is None:
   351             return value
   464             return value
   352         try:
   465         try:
   353             return int(value)
   466             return int(value)
   354         except (TypeError, ValueError):
   467         except (TypeError, ValueError):
   355             raise exceptions.ValidationError(
   468             raise exceptions.ValidationError(self.error_messages['invalid'])
   356                 _("This value must be an integer."))
   469 
   357 
   470     def validate(self, value, model_instance):
   358     def get_db_prep_value(self, value):
   471         pass
       
   472 
       
   473     def get_prep_value(self, value):
   359         if value is None:
   474         if value is None:
   360             return None
   475             return None
   361         return int(value)
   476         return int(value)
   362 
   477 
   363     def contribute_to_class(self, cls, name):
   478     def contribute_to_class(self, cls, name):
   369     def formfield(self, **kwargs):
   484     def formfield(self, **kwargs):
   370         return None
   485         return None
   371 
   486 
   372 class BooleanField(Field):
   487 class BooleanField(Field):
   373     empty_strings_allowed = False
   488     empty_strings_allowed = False
       
   489     default_error_messages = {
       
   490         'invalid': _(u'This value must be either True or False.'),
       
   491     }
       
   492     description = _("Boolean (Either True or False)")
   374     def __init__(self, *args, **kwargs):
   493     def __init__(self, *args, **kwargs):
   375         kwargs['blank'] = True
   494         kwargs['blank'] = True
   376         if 'default' not in kwargs and not kwargs.get('null'):
   495         if 'default' not in kwargs and not kwargs.get('null'):
   377             kwargs['default'] = False
   496             kwargs['default'] = False
   378         Field.__init__(self, *args, **kwargs)
   497         Field.__init__(self, *args, **kwargs)
   379 
   498 
   380     def get_internal_type(self):
   499     def get_internal_type(self):
   381         return "BooleanField"
   500         return "BooleanField"
   382 
   501 
   383     def to_python(self, value):
   502     def to_python(self, value):
   384         if value in (True, False): return value
   503         if value in (True, False):
   385         if value in ('t', 'True', '1'): return True
   504             # if value is 1 or 0 than it's equal to True or False, but we want
   386         if value in ('f', 'False', '0'): return False
   505             # to return a true bool for semantic reasons.
   387         raise exceptions.ValidationError(
   506             return bool(value)
   388             _("This value must be either True or False."))
   507         if value in ('t', 'True', '1'):
   389 
   508             return True
   390     def get_db_prep_lookup(self, lookup_type, value):
   509         if value in ('f', 'False', '0'):
       
   510             return False
       
   511         raise exceptions.ValidationError(self.error_messages['invalid'])
       
   512 
       
   513     def get_prep_lookup(self, lookup_type, value):
   391         # Special-case handling for filters coming from a web request (e.g. the
   514         # Special-case handling for filters coming from a web request (e.g. the
   392         # admin interface). Only works for scalar values (not lists). If you're
   515         # admin interface). Only works for scalar values (not lists). If you're
   393         # passing in a list, you might as well make things the right type when
   516         # passing in a list, you might as well make things the right type when
   394         # constructing the list.
   517         # constructing the list.
   395         if value in ('1', '0'):
   518         if value in ('1', '0'):
   396             value = bool(int(value))
   519             value = bool(int(value))
   397         return super(BooleanField, self).get_db_prep_lookup(lookup_type, value)
   520         return super(BooleanField, self).get_prep_lookup(lookup_type, value)
   398 
   521 
   399     def get_db_prep_value(self, value):
   522     def get_prep_value(self, value):
   400         if value is None:
   523         if value is None:
   401             return None
   524             return None
   402         return bool(value)
   525         return bool(value)
   403 
   526 
   404     def formfield(self, **kwargs):
   527     def formfield(self, **kwargs):
   411             defaults = {'form_class': forms.BooleanField}
   534             defaults = {'form_class': forms.BooleanField}
   412         defaults.update(kwargs)
   535         defaults.update(kwargs)
   413         return super(BooleanField, self).formfield(**defaults)
   536         return super(BooleanField, self).formfield(**defaults)
   414 
   537 
   415 class CharField(Field):
   538 class CharField(Field):
       
   539     description = _("String (up to %(max_length)s)")
       
   540 
       
   541     def __init__(self, *args, **kwargs):
       
   542         super(CharField, self).__init__(*args, **kwargs)
       
   543         self.validators.append(validators.MaxLengthValidator(self.max_length))
       
   544 
   416     def get_internal_type(self):
   545     def get_internal_type(self):
   417         return "CharField"
   546         return "CharField"
   418 
   547 
   419     def to_python(self, value):
   548     def to_python(self, value):
   420         if isinstance(value, basestring):
   549         if isinstance(value, basestring) or value is None:
   421             return value
   550             return value
   422         if value is None:
       
   423             if self.null:
       
   424                 return value
       
   425             else:
       
   426                 raise exceptions.ValidationError(
       
   427                     ugettext_lazy("This field cannot be null."))
       
   428         return smart_unicode(value)
   551         return smart_unicode(value)
   429 
   552 
   430     def formfield(self, **kwargs):
   553     def get_prep_value(self, value):
       
   554         return self.to_python(value)
       
   555 
       
   556     def formfield(self, **kwargs):
       
   557         # Passing max_length to forms.CharField means that the value's length
       
   558         # will be validated twice. This is considered acceptable since we want
       
   559         # the value in the form field (to pass into widget for example).
   431         defaults = {'max_length': self.max_length}
   560         defaults = {'max_length': self.max_length}
   432         defaults.update(kwargs)
   561         defaults.update(kwargs)
   433         return super(CharField, self).formfield(**defaults)
   562         return super(CharField, self).formfield(**defaults)
   434 
   563 
   435 # TODO: Maybe move this into contrib, because it's specialized.
   564 # TODO: Maybe move this into contrib, because it's specialized.
   436 class CommaSeparatedIntegerField(CharField):
   565 class CommaSeparatedIntegerField(CharField):
       
   566     default_validators = [validators.validate_comma_separated_integer_list]
       
   567     description = _("Comma-separated integers")
       
   568 
   437     def formfield(self, **kwargs):
   569     def formfield(self, **kwargs):
   438         defaults = {
   570         defaults = {
   439             'form_class': forms.RegexField,
       
   440             'regex': '^[\d,]+$',
       
   441             'max_length': self.max_length,
       
   442             'error_messages': {
   571             'error_messages': {
   443                 'invalid': _(u'Enter only digits separated by commas.'),
   572                 'invalid': _(u'Enter only digits separated by commas.'),
   444             }
   573             }
   445         }
   574         }
   446         defaults.update(kwargs)
   575         defaults.update(kwargs)
   447         return super(CommaSeparatedIntegerField, self).formfield(**defaults)
   576         return super(CommaSeparatedIntegerField, self).formfield(**defaults)
   448 
   577 
   449 ansi_date_re = re.compile(r'^\d{4}-\d{1,2}-\d{1,2}$')
   578 ansi_date_re = re.compile(r'^\d{4}-\d{1,2}-\d{1,2}$')
   450 
   579 
   451 class DateField(Field):
   580 class DateField(Field):
       
   581     description = _("Date (without time)")
       
   582 
   452     empty_strings_allowed = False
   583     empty_strings_allowed = False
       
   584     default_error_messages = {
       
   585         'invalid': _('Enter a valid date in YYYY-MM-DD format.'),
       
   586         'invalid_date': _('Invalid date: %s'),
       
   587     }
   453     def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs):
   588     def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs):
   454         self.auto_now, self.auto_now_add = auto_now, auto_now_add
   589         self.auto_now, self.auto_now_add = auto_now, auto_now_add
   455         #HACKs : auto_now_add/auto_now should be done as a default or a pre_save.
   590         #HACKs : auto_now_add/auto_now should be done as a default or a pre_save.
   456         if auto_now or auto_now_add:
   591         if auto_now or auto_now_add:
   457             kwargs['editable'] = False
   592             kwargs['editable'] = False
   468             return value.date()
   603             return value.date()
   469         if isinstance(value, datetime.date):
   604         if isinstance(value, datetime.date):
   470             return value
   605             return value
   471 
   606 
   472         if not ansi_date_re.search(value):
   607         if not ansi_date_re.search(value):
   473             raise exceptions.ValidationError(
   608             raise exceptions.ValidationError(self.error_messages['invalid'])
   474                 _('Enter a valid date in YYYY-MM-DD format.'))
       
   475         # Now that we have the date string in YYYY-MM-DD format, check to make
   609         # Now that we have the date string in YYYY-MM-DD format, check to make
   476         # sure it's a valid date.
   610         # sure it's a valid date.
   477         # We could use time.strptime here and catch errors, but datetime.date
   611         # We could use time.strptime here and catch errors, but datetime.date
   478         # produces much friendlier error messages.
   612         # produces much friendlier error messages.
   479         year, month, day = map(int, value.split('-'))
   613         year, month, day = map(int, value.split('-'))
   480         try:
   614         try:
   481             return datetime.date(year, month, day)
   615             return datetime.date(year, month, day)
   482         except ValueError, e:
   616         except ValueError, e:
   483             msg = _('Invalid date: %s') % _(str(e))
   617             msg = self.error_messages['invalid_date'] % _(str(e))
   484             raise exceptions.ValidationError(msg)
   618             raise exceptions.ValidationError(msg)
   485 
   619 
   486     def pre_save(self, model_instance, add):
   620     def pre_save(self, model_instance, add):
   487         if self.auto_now or (self.auto_now_add and add):
   621         if self.auto_now or (self.auto_now_add and add):
   488             value = datetime.datetime.now()
   622             value = datetime.datetime.now()
   497             setattr(cls, 'get_next_by_%s' % self.name,
   631             setattr(cls, 'get_next_by_%s' % self.name,
   498                 curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=True))
   632                 curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=True))
   499             setattr(cls, 'get_previous_by_%s' % self.name,
   633             setattr(cls, 'get_previous_by_%s' % self.name,
   500                 curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=False))
   634                 curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=False))
   501 
   635 
   502     def get_db_prep_lookup(self, lookup_type, value):
   636     def get_prep_lookup(self, lookup_type, value):
   503         # For "__month", "__day", and "__week_day" lookups, convert the value
   637         # For "__month", "__day", and "__week_day" lookups, convert the value
   504         # to an int so the database backend always sees a consistent type.
   638         # to an int so the database backend always sees a consistent type.
   505         if lookup_type in ('month', 'day', 'week_day'):
   639         if lookup_type in ('month', 'day', 'week_day'):
   506             return [int(value)]
   640             return int(value)
   507         return super(DateField, self).get_db_prep_lookup(lookup_type, value)
   641         return super(DateField, self).get_prep_lookup(lookup_type, value)
   508 
   642 
   509     def get_db_prep_value(self, value):
   643     def get_prep_value(self, value):
       
   644         return self.to_python(value)
       
   645 
       
   646     def get_db_prep_value(self, value, connection, prepared=False):
   510         # Casts dates into the format expected by the backend
   647         # Casts dates into the format expected by the backend
   511         return connection.ops.value_to_db_date(self.to_python(value))
   648         if not prepared:
       
   649             value = self.get_prep_value(value)
       
   650         return connection.ops.value_to_db_date(value)
   512 
   651 
   513     def value_to_string(self, obj):
   652     def value_to_string(self, obj):
   514         val = self._get_val_from_obj(obj)
   653         val = self._get_val_from_obj(obj)
   515         if val is None:
   654         if val is None:
   516             data = ''
   655             data = ''
   522         defaults = {'form_class': forms.DateField}
   661         defaults = {'form_class': forms.DateField}
   523         defaults.update(kwargs)
   662         defaults.update(kwargs)
   524         return super(DateField, self).formfield(**defaults)
   663         return super(DateField, self).formfield(**defaults)
   525 
   664 
   526 class DateTimeField(DateField):
   665 class DateTimeField(DateField):
       
   666     default_error_messages = {
       
   667         'invalid': _(u'Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.'),
       
   668     }
       
   669     description = _("Date (with time)")
       
   670 
   527     def get_internal_type(self):
   671     def get_internal_type(self):
   528         return "DateTimeField"
   672         return "DateTimeField"
   529 
   673 
   530     def to_python(self, value):
   674     def to_python(self, value):
   531         if value is None:
   675         if value is None:
   541         if '.' in value:
   685         if '.' in value:
   542             try:
   686             try:
   543                 value, usecs = value.split('.')
   687                 value, usecs = value.split('.')
   544                 usecs = int(usecs)
   688                 usecs = int(usecs)
   545             except ValueError:
   689             except ValueError:
   546                 raise exceptions.ValidationError(
   690                 raise exceptions.ValidationError(self.error_messages['invalid'])
   547                     _('Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.'))
       
   548         else:
   691         else:
   549             usecs = 0
   692             usecs = 0
   550         kwargs = {'microsecond': usecs}
   693         kwargs = {'microsecond': usecs}
   551         try: # Seconds are optional, so try converting seconds first.
   694         try: # Seconds are optional, so try converting seconds first.
   552             return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M:%S')[:6],
   695             return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M:%S')[:6],
   559             except ValueError: # Try without hour/minutes/seconds.
   702             except ValueError: # Try without hour/minutes/seconds.
   560                 try:
   703                 try:
   561                     return datetime.datetime(*time.strptime(value, '%Y-%m-%d')[:3],
   704                     return datetime.datetime(*time.strptime(value, '%Y-%m-%d')[:3],
   562                                              **kwargs)
   705                                              **kwargs)
   563                 except ValueError:
   706                 except ValueError:
   564                     raise exceptions.ValidationError(
   707                     raise exceptions.ValidationError(self.error_messages['invalid'])
   565                         _('Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.'))
   708 
   566 
   709     def get_prep_value(self, value):
   567     def get_db_prep_value(self, value):
   710         return self.to_python(value)
       
   711 
       
   712     def get_db_prep_value(self, value, connection, prepared=False):
   568         # Casts dates into the format expected by the backend
   713         # Casts dates into the format expected by the backend
   569         return connection.ops.value_to_db_datetime(self.to_python(value))
   714         if not prepared:
       
   715             value = self.get_prep_value(value)
       
   716         return connection.ops.value_to_db_datetime(value)
   570 
   717 
   571     def value_to_string(self, obj):
   718     def value_to_string(self, obj):
   572         val = self._get_val_from_obj(obj)
   719         val = self._get_val_from_obj(obj)
   573         if val is None:
   720         if val is None:
   574             data = ''
   721             data = ''
   582         defaults.update(kwargs)
   729         defaults.update(kwargs)
   583         return super(DateTimeField, self).formfield(**defaults)
   730         return super(DateTimeField, self).formfield(**defaults)
   584 
   731 
   585 class DecimalField(Field):
   732 class DecimalField(Field):
   586     empty_strings_allowed = False
   733     empty_strings_allowed = False
       
   734     default_error_messages = {
       
   735         'invalid': _(u'This value must be a decimal number.'),
       
   736     }
       
   737     description = _("Decimal number")
       
   738 
   587     def __init__(self, verbose_name=None, name=None, max_digits=None, decimal_places=None, **kwargs):
   739     def __init__(self, verbose_name=None, name=None, max_digits=None, decimal_places=None, **kwargs):
   588         self.max_digits, self.decimal_places = max_digits, decimal_places
   740         self.max_digits, self.decimal_places = max_digits, decimal_places
   589         Field.__init__(self, verbose_name, name, **kwargs)
   741         Field.__init__(self, verbose_name, name, **kwargs)
   590 
   742 
   591     def get_internal_type(self):
   743     def get_internal_type(self):
   595         if value is None:
   747         if value is None:
   596             return value
   748             return value
   597         try:
   749         try:
   598             return decimal.Decimal(value)
   750             return decimal.Decimal(value)
   599         except decimal.InvalidOperation:
   751         except decimal.InvalidOperation:
   600             raise exceptions.ValidationError(
   752             raise exceptions.ValidationError(self.error_messages['invalid'])
   601                 _("This value must be a decimal number."))
       
   602 
   753 
   603     def _format(self, value):
   754     def _format(self, value):
   604         if isinstance(value, basestring) or value is None:
   755         if isinstance(value, basestring) or value is None:
   605             return value
   756             return value
   606         else:
   757         else:
   618         # backwards-compatibility with any external code which may have used
   769         # backwards-compatibility with any external code which may have used
   619         # this method.
   770         # this method.
   620         from django.db.backends import util
   771         from django.db.backends import util
   621         return util.format_number(value, self.max_digits, self.decimal_places)
   772         return util.format_number(value, self.max_digits, self.decimal_places)
   622 
   773 
   623     def get_db_prep_save(self, value):
   774     def get_db_prep_save(self, value, connection):
   624         return connection.ops.value_to_db_decimal(self.to_python(value),
   775         return connection.ops.value_to_db_decimal(self.to_python(value),
   625                 self.max_digits, self.decimal_places)
   776                 self.max_digits, self.decimal_places)
   626 
   777 
   627     def get_db_prep_value(self, value):
   778     def get_prep_value(self, value):
   628         return self.to_python(value)
   779         return self.to_python(value)
   629 
   780 
   630     def formfield(self, **kwargs):
   781     def formfield(self, **kwargs):
   631         defaults = {
   782         defaults = {
   632             'max_digits': self.max_digits,
   783             'max_digits': self.max_digits,
   635         }
   786         }
   636         defaults.update(kwargs)
   787         defaults.update(kwargs)
   637         return super(DecimalField, self).formfield(**defaults)
   788         return super(DecimalField, self).formfield(**defaults)
   638 
   789 
   639 class EmailField(CharField):
   790 class EmailField(CharField):
       
   791     default_validators = [validators.validate_email]
       
   792     description = _("E-mail address")
       
   793 
   640     def __init__(self, *args, **kwargs):
   794     def __init__(self, *args, **kwargs):
   641         kwargs['max_length'] = kwargs.get('max_length', 75)
   795         kwargs['max_length'] = kwargs.get('max_length', 75)
   642         CharField.__init__(self, *args, **kwargs)
   796         CharField.__init__(self, *args, **kwargs)
   643 
   797 
   644     def formfield(self, **kwargs):
       
   645         defaults = {'form_class': forms.EmailField}
       
   646         defaults.update(kwargs)
       
   647         return super(EmailField, self).formfield(**defaults)
       
   648 
       
   649 class FilePathField(Field):
   798 class FilePathField(Field):
       
   799     description = _("File path")
       
   800 
   650     def __init__(self, verbose_name=None, name=None, path='', match=None, recursive=False, **kwargs):
   801     def __init__(self, verbose_name=None, name=None, path='', match=None, recursive=False, **kwargs):
   651         self.path, self.match, self.recursive = path, match, recursive
   802         self.path, self.match, self.recursive = path, match, recursive
   652         kwargs['max_length'] = kwargs.get('max_length', 100)
   803         kwargs['max_length'] = kwargs.get('max_length', 100)
   653         Field.__init__(self, verbose_name, name, **kwargs)
   804         Field.__init__(self, verbose_name, name, **kwargs)
   654 
   805 
   665     def get_internal_type(self):
   816     def get_internal_type(self):
   666         return "FilePathField"
   817         return "FilePathField"
   667 
   818 
   668 class FloatField(Field):
   819 class FloatField(Field):
   669     empty_strings_allowed = False
   820     empty_strings_allowed = False
   670 
   821     default_error_messages = {
   671     def get_db_prep_value(self, value):
   822         'invalid': _("This value must be a float."),
       
   823     }
       
   824     description = _("Floating point number")
       
   825 
       
   826     def get_prep_value(self, value):
   672         if value is None:
   827         if value is None:
   673             return None
   828             return None
   674         return float(value)
   829         return float(value)
   675 
   830 
   676     def get_internal_type(self):
   831     def get_internal_type(self):
   680         if value is None:
   835         if value is None:
   681             return value
   836             return value
   682         try:
   837         try:
   683             return float(value)
   838             return float(value)
   684         except (TypeError, ValueError):
   839         except (TypeError, ValueError):
   685             raise exceptions.ValidationError(
   840             raise exceptions.ValidationError(self.error_messages['invalid'])
   686                 _("This value must be a float."))
       
   687 
   841 
   688     def formfield(self, **kwargs):
   842     def formfield(self, **kwargs):
   689         defaults = {'form_class': forms.FloatField}
   843         defaults = {'form_class': forms.FloatField}
   690         defaults.update(kwargs)
   844         defaults.update(kwargs)
   691         return super(FloatField, self).formfield(**defaults)
   845         return super(FloatField, self).formfield(**defaults)
   692 
   846 
   693 class IntegerField(Field):
   847 class IntegerField(Field):
   694     empty_strings_allowed = False
   848     empty_strings_allowed = False
   695     def get_db_prep_value(self, value):
   849     default_error_messages = {
       
   850         'invalid': _("This value must be an integer."),
       
   851     }
       
   852     description = _("Integer")
       
   853 
       
   854     def get_prep_value(self, value):
   696         if value is None:
   855         if value is None:
   697             return None
   856             return None
   698         return int(value)
   857         return int(value)
       
   858 
       
   859     def get_prep_lookup(self, lookup_type, value):
       
   860         if (lookup_type == 'gte' or lookup_type == 'lt') \
       
   861            and isinstance(value, float):
       
   862                 value = math.ceil(value)
       
   863         return super(IntegerField, self).get_prep_lookup(lookup_type, value)
   699 
   864 
   700     def get_internal_type(self):
   865     def get_internal_type(self):
   701         return "IntegerField"
   866         return "IntegerField"
   702 
   867 
   703     def to_python(self, value):
   868     def to_python(self, value):
   704         if value is None:
   869         if value is None:
   705             return value
   870             return value
   706         try:
   871         try:
   707             return int(value)
   872             return int(value)
   708         except (TypeError, ValueError):
   873         except (TypeError, ValueError):
   709             raise exceptions.ValidationError(
   874             raise exceptions.ValidationError(self.error_messages['invalid'])
   710                 _("This value must be an integer."))
       
   711 
   875 
   712     def formfield(self, **kwargs):
   876     def formfield(self, **kwargs):
   713         defaults = {'form_class': forms.IntegerField}
   877         defaults = {'form_class': forms.IntegerField}
   714         defaults.update(kwargs)
   878         defaults.update(kwargs)
   715         return super(IntegerField, self).formfield(**defaults)
   879         return super(IntegerField, self).formfield(**defaults)
       
   880 
       
   881 class BigIntegerField(IntegerField):
       
   882     empty_strings_allowed = False
       
   883     description = _("Big (8 byte) integer")
       
   884     MAX_BIGINT = 9223372036854775807
       
   885     def get_internal_type(self):
       
   886         return "BigIntegerField"
       
   887 
       
   888     def formfield(self, **kwargs):
       
   889         defaults = {'min_value': -BigIntegerField.MAX_BIGINT - 1,
       
   890                     'max_value': BigIntegerField.MAX_BIGINT}
       
   891         defaults.update(kwargs)
       
   892         return super(BigIntegerField, self).formfield(**defaults)
   716 
   893 
   717 class IPAddressField(Field):
   894 class IPAddressField(Field):
   718     empty_strings_allowed = False
   895     empty_strings_allowed = False
       
   896     description = _("IP address")
   719     def __init__(self, *args, **kwargs):
   897     def __init__(self, *args, **kwargs):
   720         kwargs['max_length'] = 15
   898         kwargs['max_length'] = 15
   721         Field.__init__(self, *args, **kwargs)
   899         Field.__init__(self, *args, **kwargs)
   722 
   900 
   723     def get_internal_type(self):
   901     def get_internal_type(self):
   728         defaults.update(kwargs)
   906         defaults.update(kwargs)
   729         return super(IPAddressField, self).formfield(**defaults)
   907         return super(IPAddressField, self).formfield(**defaults)
   730 
   908 
   731 class NullBooleanField(Field):
   909 class NullBooleanField(Field):
   732     empty_strings_allowed = False
   910     empty_strings_allowed = False
       
   911     default_error_messages = {
       
   912         'invalid': _("This value must be either None, True or False."),
       
   913     }
       
   914     description = _("Boolean (Either True, False or None)")
       
   915 
   733     def __init__(self, *args, **kwargs):
   916     def __init__(self, *args, **kwargs):
   734         kwargs['null'] = True
   917         kwargs['null'] = True
       
   918         kwargs['blank'] = True
   735         Field.__init__(self, *args, **kwargs)
   919         Field.__init__(self, *args, **kwargs)
   736 
   920 
   737     def get_internal_type(self):
   921     def get_internal_type(self):
   738         return "NullBooleanField"
   922         return "NullBooleanField"
   739 
   923 
   740     def to_python(self, value):
   924     def to_python(self, value):
   741         if value in (None, True, False): return value
   925         if value is None:
   742         if value in ('None',): return None
   926             return None
   743         if value in ('t', 'True', '1'): return True
   927         if value in (True, False):
   744         if value in ('f', 'False', '0'): return False
   928             return bool(value)
   745         raise exceptions.ValidationError(
   929         if value in ('None',):
   746             _("This value must be either None, True or False."))
   930             return None
   747 
   931         if value in ('t', 'True', '1'):
   748     def get_db_prep_lookup(self, lookup_type, value):
   932             return True
       
   933         if value in ('f', 'False', '0'):
       
   934             return False
       
   935         raise exceptions.ValidationError(self.error_messages['invalid'])
       
   936 
       
   937     def get_prep_lookup(self, lookup_type, value):
   749         # Special-case handling for filters coming from a web request (e.g. the
   938         # Special-case handling for filters coming from a web request (e.g. the
   750         # admin interface). Only works for scalar values (not lists). If you're
   939         # admin interface). Only works for scalar values (not lists). If you're
   751         # passing in a list, you might as well make things the right type when
   940         # passing in a list, you might as well make things the right type when
   752         # constructing the list.
   941         # constructing the list.
   753         if value in ('1', '0'):
   942         if value in ('1', '0'):
   754             value = bool(int(value))
   943             value = bool(int(value))
   755         return super(NullBooleanField, self).get_db_prep_lookup(lookup_type, value)
   944         return super(NullBooleanField, self).get_prep_lookup(lookup_type, value)
   756 
   945 
   757     def get_db_prep_value(self, value):
   946     def get_prep_value(self, value):
   758         if value is None:
   947         if value is None:
   759             return None
   948             return None
   760         return bool(value)
   949         return bool(value)
   761 
   950 
   762     def formfield(self, **kwargs):
   951     def formfield(self, **kwargs):
   767             'help_text': self.help_text}
   956             'help_text': self.help_text}
   768         defaults.update(kwargs)
   957         defaults.update(kwargs)
   769         return super(NullBooleanField, self).formfield(**defaults)
   958         return super(NullBooleanField, self).formfield(**defaults)
   770 
   959 
   771 class PositiveIntegerField(IntegerField):
   960 class PositiveIntegerField(IntegerField):
       
   961     description = _("Integer")
       
   962 
   772     def get_internal_type(self):
   963     def get_internal_type(self):
   773         return "PositiveIntegerField"
   964         return "PositiveIntegerField"
   774 
   965 
   775     def formfield(self, **kwargs):
   966     def formfield(self, **kwargs):
   776         defaults = {'min_value': 0}
   967         defaults = {'min_value': 0}
   777         defaults.update(kwargs)
   968         defaults.update(kwargs)
   778         return super(PositiveIntegerField, self).formfield(**defaults)
   969         return super(PositiveIntegerField, self).formfield(**defaults)
   779 
   970 
   780 class PositiveSmallIntegerField(IntegerField):
   971 class PositiveSmallIntegerField(IntegerField):
       
   972     description = _("Integer")
   781     def get_internal_type(self):
   973     def get_internal_type(self):
   782         return "PositiveSmallIntegerField"
   974         return "PositiveSmallIntegerField"
   783 
   975 
   784     def formfield(self, **kwargs):
   976     def formfield(self, **kwargs):
   785         defaults = {'min_value': 0}
   977         defaults = {'min_value': 0}
   786         defaults.update(kwargs)
   978         defaults.update(kwargs)
   787         return super(PositiveSmallIntegerField, self).formfield(**defaults)
   979         return super(PositiveSmallIntegerField, self).formfield(**defaults)
   788 
   980 
   789 class SlugField(CharField):
   981 class SlugField(CharField):
       
   982     description = _("String (up to %(max_length)s)")
   790     def __init__(self, *args, **kwargs):
   983     def __init__(self, *args, **kwargs):
   791         kwargs['max_length'] = kwargs.get('max_length', 50)
   984         kwargs['max_length'] = kwargs.get('max_length', 50)
   792         # Set db_index=True unless it's been set manually.
   985         # Set db_index=True unless it's been set manually.
   793         if 'db_index' not in kwargs:
   986         if 'db_index' not in kwargs:
   794             kwargs['db_index'] = True
   987             kwargs['db_index'] = True
   801         defaults = {'form_class': forms.SlugField}
   994         defaults = {'form_class': forms.SlugField}
   802         defaults.update(kwargs)
   995         defaults.update(kwargs)
   803         return super(SlugField, self).formfield(**defaults)
   996         return super(SlugField, self).formfield(**defaults)
   804 
   997 
   805 class SmallIntegerField(IntegerField):
   998 class SmallIntegerField(IntegerField):
       
   999     description = _("Integer")
       
  1000 
   806     def get_internal_type(self):
  1001     def get_internal_type(self):
   807         return "SmallIntegerField"
  1002         return "SmallIntegerField"
   808 
  1003 
   809 class TextField(Field):
  1004 class TextField(Field):
       
  1005     description = _("Text")
       
  1006 
   810     def get_internal_type(self):
  1007     def get_internal_type(self):
   811         return "TextField"
  1008         return "TextField"
   812 
  1009 
       
  1010     def get_prep_value(self, value):
       
  1011         if isinstance(value, basestring) or value is None:
       
  1012             return value
       
  1013         return smart_unicode(value)
       
  1014 
   813     def formfield(self, **kwargs):
  1015     def formfield(self, **kwargs):
   814         defaults = {'widget': forms.Textarea}
  1016         defaults = {'widget': forms.Textarea}
   815         defaults.update(kwargs)
  1017         defaults.update(kwargs)
   816         return super(TextField, self).formfield(**defaults)
  1018         return super(TextField, self).formfield(**defaults)
   817 
  1019 
   818 class TimeField(Field):
  1020 class TimeField(Field):
       
  1021     description = _("Time")
       
  1022 
   819     empty_strings_allowed = False
  1023     empty_strings_allowed = False
       
  1024     default_error_messages = {
       
  1025         'invalid': _('Enter a valid time in HH:MM[:ss[.uuuuuu]] format.'),
       
  1026     }
   820     def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs):
  1027     def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs):
   821         self.auto_now, self.auto_now_add = auto_now, auto_now_add
  1028         self.auto_now, self.auto_now_add = auto_now, auto_now_add
   822         if auto_now or auto_now_add:
  1029         if auto_now or auto_now_add:
   823             kwargs['editable'] = False
  1030             kwargs['editable'] = False
   824         Field.__init__(self, verbose_name, name, **kwargs)
  1031         Field.__init__(self, verbose_name, name, **kwargs)
   833             return value
  1040             return value
   834         if isinstance(value, datetime.datetime):
  1041         if isinstance(value, datetime.datetime):
   835             # Not usually a good idea to pass in a datetime here (it loses
  1042             # Not usually a good idea to pass in a datetime here (it loses
   836             # information), but this can be a side-effect of interacting with a
  1043             # information), but this can be a side-effect of interacting with a
   837             # database backend (e.g. Oracle), so we'll be accommodating.
  1044             # database backend (e.g. Oracle), so we'll be accommodating.
   838             return value.time
  1045             return value.time()
   839 
  1046 
   840         # Attempt to parse a datetime:
  1047         # Attempt to parse a datetime:
   841         value = smart_str(value)
  1048         value = smart_str(value)
   842         # split usecs, because they are not recognized by strptime.
  1049         # split usecs, because they are not recognized by strptime.
   843         if '.' in value:
  1050         if '.' in value:
   844             try:
  1051             try:
   845                 value, usecs = value.split('.')
  1052                 value, usecs = value.split('.')
   846                 usecs = int(usecs)
  1053                 usecs = int(usecs)
   847             except ValueError:
  1054             except ValueError:
   848                 raise exceptions.ValidationError(
  1055                 raise exceptions.ValidationError(self.error_messages['invalid'])
   849                     _('Enter a valid time in HH:MM[:ss[.uuuuuu]] format.'))
       
   850         else:
  1056         else:
   851             usecs = 0
  1057             usecs = 0
   852         kwargs = {'microsecond': usecs}
  1058         kwargs = {'microsecond': usecs}
   853 
  1059 
   854         try: # Seconds are optional, so try converting seconds first.
  1060         try: # Seconds are optional, so try converting seconds first.
   857         except ValueError:
  1063         except ValueError:
   858             try: # Try without seconds.
  1064             try: # Try without seconds.
   859                 return datetime.time(*time.strptime(value, '%H:%M')[3:5],
  1065                 return datetime.time(*time.strptime(value, '%H:%M')[3:5],
   860                                          **kwargs)
  1066                                          **kwargs)
   861             except ValueError:
  1067             except ValueError:
   862                 raise exceptions.ValidationError(
  1068                 raise exceptions.ValidationError(self.error_messages['invalid'])
   863                     _('Enter a valid time in HH:MM[:ss[.uuuuuu]] format.'))
       
   864 
  1069 
   865     def pre_save(self, model_instance, add):
  1070     def pre_save(self, model_instance, add):
   866         if self.auto_now or (self.auto_now_add and add):
  1071         if self.auto_now or (self.auto_now_add and add):
   867             value = datetime.datetime.now().time()
  1072             value = datetime.datetime.now().time()
   868             setattr(model_instance, self.attname, value)
  1073             setattr(model_instance, self.attname, value)
   869             return value
  1074             return value
   870         else:
  1075         else:
   871             return super(TimeField, self).pre_save(model_instance, add)
  1076             return super(TimeField, self).pre_save(model_instance, add)
   872 
  1077 
   873     def get_db_prep_value(self, value):
  1078     def get_prep_value(self, value):
       
  1079         return self.to_python(value)
       
  1080 
       
  1081     def get_db_prep_value(self, value, connection, prepared=False):
   874         # Casts times into the format expected by the backend
  1082         # Casts times into the format expected by the backend
   875         return connection.ops.value_to_db_time(self.to_python(value))
  1083         if not prepared:
       
  1084             value = self.get_prep_value(value)
       
  1085         return connection.ops.value_to_db_time(value)
   876 
  1086 
   877     def value_to_string(self, obj):
  1087     def value_to_string(self, obj):
   878         val = self._get_val_from_obj(obj)
  1088         val = self._get_val_from_obj(obj)
   879         if val is None:
  1089         if val is None:
   880             data = ''
  1090             data = ''
   886         defaults = {'form_class': forms.TimeField}
  1096         defaults = {'form_class': forms.TimeField}
   887         defaults.update(kwargs)
  1097         defaults.update(kwargs)
   888         return super(TimeField, self).formfield(**defaults)
  1098         return super(TimeField, self).formfield(**defaults)
   889 
  1099 
   890 class URLField(CharField):
  1100 class URLField(CharField):
       
  1101     description = _("URL")
       
  1102 
   891     def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
  1103     def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
   892         kwargs['max_length'] = kwargs.get('max_length', 200)
  1104         kwargs['max_length'] = kwargs.get('max_length', 200)
   893         self.verify_exists = verify_exists
       
   894         CharField.__init__(self, verbose_name, name, **kwargs)
  1105         CharField.__init__(self, verbose_name, name, **kwargs)
   895 
  1106         self.validators.append(validators.URLValidator(verify_exists=verify_exists))
   896     def formfield(self, **kwargs):
       
   897         defaults = {'form_class': forms.URLField, 'verify_exists': self.verify_exists}
       
   898         defaults.update(kwargs)
       
   899         return super(URLField, self).formfield(**defaults)
       
   900 
  1107 
   901 class XMLField(TextField):
  1108 class XMLField(TextField):
       
  1109     description = _("XML text")
       
  1110 
   902     def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
  1111     def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
   903         self.schema_path = schema_path
  1112         self.schema_path = schema_path
   904         Field.__init__(self, verbose_name, name, **kwargs)
  1113         Field.__init__(self, verbose_name, name, **kwargs)
       
  1114