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 |
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 # |
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'): |
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 |
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 = '' |
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): |
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 |
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 |