Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

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
  • Loading branch information...
commit df66763406cc76e8d0c65b3a857c891c21c25f49 1 parent e243d82
@adrianholovaty adrianholovaty authored
View
35 django/core/meta.py
@@ -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 @@ def get_manipulator_new_data(self, new_data, rel=False):
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 @@ def get_manipulator_field_objs(self):
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 @@ def get_manipulator_field_objs(self):
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 @@ def get_filename(self, filename):
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 @@ def get_manipulator_field_objs(self):
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 @@ def get_manipulator_field_objs(self):
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 @@ def get_manipulator_field_objs(self):
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 @@ def get_manipulator_field_objs(self):
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 @@ def get_manipulator_field_objs(self):
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 @@ def get_manipulator_field_objs(self):
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)
View
16 docs/db-api.txt
@@ -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()``.
View
19 docs/model-api.txt
@@ -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.
View
24 docs/overview.txt
@@ -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/
View
14 docs/tutorial01.txt
@@ -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``.
Please sign in to comment.
Something went wrong with that request. Please try again.