Fixed #67 -- Human-readable name is now optional in model fields. If a second positional argument isn't given, Django will use the first argument, converting underscores to spaces. This change is fully backwards-compatible.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@212 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
e243d82874
commit
df66763406
|
@ -1564,13 +1564,14 @@ class Field(object):
|
|||
# database level.
|
||||
empty_strings_allowed = True
|
||||
|
||||
def __init__(self, name, verbose_name, primary_key=False,
|
||||
def __init__(self, name, verbose_name=None, primary_key=False,
|
||||
maxlength=None, unique=False, blank=False, null=False, db_index=None,
|
||||
core=False, rel=None, default=NOT_PROVIDED, editable=True,
|
||||
prepopulate_from=None, unique_for_date=None, unique_for_month=None,
|
||||
unique_for_year=None, validator_list=None, choices=None, radio_admin=None,
|
||||
help_text=''):
|
||||
self.name, self.verbose_name = name, verbose_name
|
||||
self.name = name
|
||||
self.verbose_name = verbose_name or name.replace('_', ' ')
|
||||
self.primary_key = primary_key
|
||||
self.maxlength, self.unique = maxlength, unique
|
||||
self.blank, self.null = blank, null
|
||||
|
@ -1767,9 +1768,9 @@ class AutoField(Field):
|
|||
return Field.get_manipulator_new_data(self, new_data, rel)
|
||||
|
||||
class BooleanField(Field):
|
||||
def __init__(self, name, verbose_name, **kwargs):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['blank'] = True
|
||||
Field.__init__(self, name, verbose_name, **kwargs)
|
||||
Field.__init__(self, *args, **kwargs)
|
||||
|
||||
def get_manipulator_field_objs(self):
|
||||
return [formfields.CheckboxField]
|
||||
|
@ -1784,7 +1785,7 @@ class CommaSeparatedIntegerField(CharField):
|
|||
|
||||
class DateField(Field):
|
||||
empty_strings_allowed = False
|
||||
def __init__(self, name, verbose_name, auto_now=False, auto_now_add=False, **kwargs):
|
||||
def __init__(self, name, verbose_name=None, auto_now=False, auto_now_add=False, **kwargs):
|
||||
self.auto_now, self.auto_now_add = auto_now, auto_now_add
|
||||
if auto_now or auto_now_add:
|
||||
kwargs['editable'] = False
|
||||
|
@ -1840,7 +1841,7 @@ class EmailField(Field):
|
|||
return [formfields.EmailField]
|
||||
|
||||
class FileField(Field):
|
||||
def __init__(self, name, verbose_name, upload_to='', **kwargs):
|
||||
def __init__(self, name, verbose_name=None, upload_to='', **kwargs):
|
||||
self.upload_to = upload_to
|
||||
Field.__init__(self, name, verbose_name, **kwargs)
|
||||
|
||||
|
@ -1905,7 +1906,7 @@ class FileField(Field):
|
|||
|
||||
class FloatField(Field):
|
||||
empty_strings_allowed = False
|
||||
def __init__(self, name, verbose_name, max_digits, decimal_places, **kwargs):
|
||||
def __init__(self, name, verbose_name=None, max_digits=None, decimal_places=None, **kwargs):
|
||||
self.max_digits, self.decimal_places = max_digits, decimal_places
|
||||
Field.__init__(self, name, verbose_name, **kwargs)
|
||||
|
||||
|
@ -1913,7 +1914,7 @@ class FloatField(Field):
|
|||
return [curry(formfields.FloatField, max_digits=self.max_digits, decimal_places=self.decimal_places)]
|
||||
|
||||
class ImageField(FileField):
|
||||
def __init__(self, name, verbose_name, width_field=None, height_field=None, **kwargs):
|
||||
def __init__(self, name, verbose_name=None, width_field=None, height_field=None, **kwargs):
|
||||
self.width_field, self.height_field = width_field, height_field
|
||||
FileField.__init__(self, name, verbose_name, **kwargs)
|
||||
|
||||
|
@ -1938,17 +1939,17 @@ class IntegerField(Field):
|
|||
return [formfields.IntegerField]
|
||||
|
||||
class IPAddressField(Field):
|
||||
def __init__(self, name, verbose_name, **kwargs):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['maxlength'] = 15
|
||||
Field.__init__(self, name, verbose_name, **kwargs)
|
||||
Field.__init__(self, *args, **kwargs)
|
||||
|
||||
def get_manipulator_field_objs(self):
|
||||
return [formfields.IPAddressField]
|
||||
|
||||
class NullBooleanField(Field):
|
||||
def __init__(self, name, verbose_name, **kwargs):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['null'] = True
|
||||
Field.__init__(self, name, verbose_name, **kwargs)
|
||||
Field.__init__(self, *args, **kwargs)
|
||||
|
||||
def get_manipulator_field_objs(self):
|
||||
return [formfields.NullBooleanField]
|
||||
|
@ -1966,13 +1967,13 @@ class PositiveSmallIntegerField(IntegerField):
|
|||
return [formfields.PositiveSmallIntegerField]
|
||||
|
||||
class SlugField(Field):
|
||||
def __init__(self, name, verbose_name, **kwargs):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['maxlength'] = 50
|
||||
kwargs.setdefault('validator_list', []).append(validators.isAlphaNumeric)
|
||||
# Set db_index=True unless it's been set manually.
|
||||
if not kwargs.has_key('db_index'):
|
||||
kwargs['db_index'] = True
|
||||
Field.__init__(self, name, verbose_name, **kwargs)
|
||||
Field.__init__(self, *args, **kwargs)
|
||||
|
||||
def get_manipulator_field_objs(self):
|
||||
return [formfields.TextField]
|
||||
|
@ -1987,7 +1988,7 @@ class TextField(Field):
|
|||
|
||||
class TimeField(Field):
|
||||
empty_strings_allowed = False
|
||||
def __init__(self, name, verbose_name, auto_now=False, auto_now_add=False, **kwargs):
|
||||
def __init__(self, name, verbose_name=None, auto_now=False, auto_now_add=False, **kwargs):
|
||||
self.auto_now, self.auto_now_add = auto_now, auto_now_add
|
||||
if auto_now or auto_now_add:
|
||||
kwargs['editable'] = False
|
||||
|
@ -2014,7 +2015,7 @@ class TimeField(Field):
|
|||
return [formfields.TimeField]
|
||||
|
||||
class URLField(Field):
|
||||
def __init__(self, name, verbose_name, verify_exists=True, **kwargs):
|
||||
def __init__(self, name, verbose_name=None, verify_exists=True, **kwargs):
|
||||
if verify_exists:
|
||||
kwargs.setdefault('validator_list', []).append(validators.isExistingURL)
|
||||
Field.__init__(self, name, verbose_name, **kwargs)
|
||||
|
@ -2027,7 +2028,7 @@ class USStateField(Field):
|
|||
return [formfields.USStateField]
|
||||
|
||||
class XMLField(Field):
|
||||
def __init__(self, name, verbose_name, schema_path, **kwargs):
|
||||
def __init__(self, name, verbose_name=None, schema_path=None, **kwargs):
|
||||
self.schema_path = schema_path
|
||||
Field.__init__(self, name, verbose_name, **kwargs)
|
||||
|
||||
|
|
|
@ -12,18 +12,18 @@ Throughout this reference, we'll refer to the following Poll application::
|
|||
|
||||
class Poll(meta.Model):
|
||||
fields = (
|
||||
meta.SlugField('slug', 'slug', unique_for_month='pub_date'),
|
||||
meta.CharField('question', 'question', maxlength=255),
|
||||
meta.DateTimeField('pub_date', 'date published'),
|
||||
meta.DateTimeField('expire_date', 'expiration date'),
|
||||
meta.SlugField('slug', unique_for_month='pub_date'),
|
||||
meta.CharField('question', maxlength=255),
|
||||
meta.DateTimeField('pub_date'),
|
||||
meta.DateTimeField('expire_date'),
|
||||
)
|
||||
|
||||
class Choice(meta.Model):
|
||||
fields = (
|
||||
meta.ForeignKey(Poll, edit_inline=True, edit_inline_type=meta.TABULAR,
|
||||
num_in_admin=10, min_num_in_admin=5),
|
||||
meta.CharField('choice', 'choice', maxlength=255, core=True),
|
||||
meta.IntegerField('votes', 'votes', editable=False, default=0),
|
||||
meta.CharField('choice', maxlength=255, core=True),
|
||||
meta.IntegerField('votes', editable=False, default=0),
|
||||
)
|
||||
|
||||
Basic lookup functions
|
||||
|
@ -351,6 +351,4 @@ the relation (``poll_id`` in this case).
|
|||
Deleting objects
|
||||
================
|
||||
|
||||
Just cause we're crazy like that, the delete method is named ``delete()``.
|
||||
Yeah, you never know what we're going to do next.
|
||||
|
||||
The delete method, conveniently, is named ``delete()``.
|
||||
|
|
|
@ -34,9 +34,9 @@ wide array of options, only ``fields`` is required.
|
|||
A list of field objects. See `Field objects`_. For example::
|
||||
|
||||
fields = (
|
||||
meta.CharField('customer_name', 'customer name', maxlength=15),
|
||||
meta.BooleanField('use_extra_cheese', 'use extra cheese'),
|
||||
meta.IntegerField('customer_type', 'customer type', choices=CUSTOMER_TYPE_CHOICES),
|
||||
meta.CharField('customer_name', maxlength=15),
|
||||
meta.BooleanField('use_extra_cheese'),
|
||||
meta.IntegerField('customer_type', choices=CUSTOMER_TYPE_CHOICES),
|
||||
...
|
||||
)
|
||||
|
||||
|
@ -123,10 +123,13 @@ the ``fields`` list is an instance of a ``meta.Field`` subclass and maps to
|
|||
a database field.
|
||||
|
||||
All field objects -- except for ``ForeignKey`` and ``ManyToManyField`` (see
|
||||
below) -- take two positional arguments and a number of keyword arguments.
|
||||
The positional arguments are the field name and the human-readable name. The
|
||||
field name must be a valid Python identifier, but the human-readable name can
|
||||
contain spaces, punctuation, etc.
|
||||
below) -- require the field's machine-readable name as the first positional
|
||||
argument. This must be a valid Python identifier -- no spaces, punctuation,
|
||||
etc., are allowed.
|
||||
|
||||
The second positional argument, a human-readable name, is optional. If the
|
||||
human-readable name isn't given, Django will use the machine-readable name,
|
||||
coverting underscores to spaces.
|
||||
|
||||
General field options
|
||||
---------------------
|
||||
|
@ -226,7 +229,7 @@ Field Types
|
|||
use this directly; a primary key field will automatically be added to your
|
||||
model if you don't specify otherwise. That automatically-added field is::
|
||||
|
||||
meta.AutoField('id', 'ID', primary_key=True)
|
||||
meta.AutoField('id', primary_key=True)
|
||||
|
||||
``BooleanField``
|
||||
A true/false field.
|
||||
|
|
|
@ -22,7 +22,7 @@ solving two years' worth of database-schema problems. Here's a quick example::
|
|||
|
||||
class Reporter(meta.Model):
|
||||
fields = (
|
||||
meta.CharField('full_name', "reporter's full name", maxlength=70),
|
||||
meta.CharField('full_name', maxlength=70),
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
|
@ -30,9 +30,9 @@ solving two years' worth of database-schema problems. Here's a quick example::
|
|||
|
||||
class Article(meta.Model):
|
||||
fields = (
|
||||
meta.DateTimeField('pub_date', 'publication date'),
|
||||
meta.CharField('headline', 'headline', maxlength=200),
|
||||
meta.TextField('article', 'article'),
|
||||
meta.DateTimeField('pub_date'),
|
||||
meta.CharField('headline', maxlength=200),
|
||||
meta.TextField('article'),
|
||||
meta.ForeignKey(Reporter),
|
||||
)
|
||||
|
||||
|
@ -133,9 +133,9 @@ classes::
|
|||
|
||||
class Article(meta.Model):
|
||||
fields = (
|
||||
meta.DateTimeField('pub_date', 'publication date'),
|
||||
meta.CharField('headline', 'headline', maxlength=200),
|
||||
meta.TextField('article', 'article'),
|
||||
meta.DateTimeField('pub_date'),
|
||||
meta.CharField('headline', maxlength=200),
|
||||
meta.TextField('article'),
|
||||
meta.ForeignKey(Reporter),
|
||||
)
|
||||
admin = meta.Admin(
|
||||
|
@ -302,7 +302,11 @@ features:
|
|||
* An RSS framework that makes creating RSS feeds as easy as writing a
|
||||
small Python class.
|
||||
* More sexy automatically-generated admin features -- this overview barely
|
||||
scratched the surface
|
||||
scratched the surface.
|
||||
|
||||
The next obvious steps are for you to download Django, read the documentation
|
||||
and join the community. Thanks for your interest!
|
||||
The next obvious steps are for you to `download Django`_, read `the tutorial`_
|
||||
and join `the community`_. Thanks for your interest!
|
||||
|
||||
.. _download Django: http://www.djangoproject.com/documentation/
|
||||
.. _the tutorial: http://www.djangoproject.com/documentation/tutorial1/
|
||||
.. _the community: http://www.djangoproject.com/community/
|
||||
|
|
|
@ -137,15 +137,15 @@ Edit the ``polls/models/polls.py`` file so that it looks like this::
|
|||
|
||||
class Poll(meta.Model):
|
||||
fields = (
|
||||
meta.CharField('question', 'question', maxlength=200),
|
||||
meta.CharField('question', maxlength=200),
|
||||
meta.DateTimeField('pub_date', 'date published'),
|
||||
)
|
||||
|
||||
class Choice(meta.Model):
|
||||
fields = (
|
||||
meta.ForeignKey(Poll),
|
||||
meta.CharField('choice', 'choice', maxlength=200),
|
||||
meta.IntegerField('votes', 'votes'),
|
||||
meta.CharField('choice', maxlength=200),
|
||||
meta.IntegerField('votes'),
|
||||
)
|
||||
|
||||
The code is straightforward. Each model is represented by a class that
|
||||
|
@ -160,8 +160,12 @@ The first argument to each ``Field`` call is the field's name, in
|
|||
machine-friendly format. You'll use this value in your Python code, and your
|
||||
database will use it as the column name.
|
||||
|
||||
The second argument is the field's human-readable name. That's used in a couple
|
||||
of introspective parts of Django, and it doubles as documentation.
|
||||
The second, optional, argument is the field's human-readable name. That's used
|
||||
in a couple of introspective parts of Django, and it doubles as documentation.
|
||||
If this field isn't provided, Django will use the machine-readable name. In
|
||||
this example, we've only defined a human-readable name for ``Poll.pub_date``.
|
||||
For all other fields in this model, the field's machine-readable name will
|
||||
suffice as its human-readable name.
|
||||
|
||||
Some ``meta.*Field`` classes have additional required elements.
|
||||
``meta.CharField``, for example, requires that you give it a ``maxlength``.
|
||||
|
|
Loading…
Reference in New Issue