Index: django/models/core.py
===================================================================
--- django/models/core.py	(revision 389)
+++ django/models/core.py	(working copy)
@@ -1,13 +1,13 @@
 from django.core import meta, validators
 
 class Site(meta.Model):
-    db_table = 'sites'
-    fields = (
-        meta.CharField('domain', 'domain name', maxlength=100),
-        meta.CharField('name', 'display name', maxlength=50),
-    )
-    ordering = ('domain',)
+    domain = meta.CharField('domain name', maxlength=100)
+    name = meta.CharField('display name', maxlength=50)
 
+    class Meta:
+        db_table = 'sites'
+        ordering = ('domain',)
+
     def __repr__(self):
         return self.domain
 
@@ -17,26 +17,26 @@
         return get_object(pk=SITE_ID)
 
 class Package(meta.Model):
-    db_table = 'packages'
-    fields = (
-        meta.CharField('label', maxlength=20, primary_key=True),
-        meta.CharField('name', maxlength=30, unique=True),
-    )
-    ordering = ('name',)
+    label = meta.CharField(maxlength=20, primary_key=True)
+    name = meta.CharField(maxlength=30, unique=True)
 
+    class Meta:
+        db_table = 'packages'
+        ordering = ('name',)
+
     def __repr__(self):
         return self.name
 
 class ContentType(meta.Model):
-    db_table = 'content_types'
-    fields = (
-        meta.CharField('name', maxlength=100),
-        meta.ForeignKey(Package, name='package'),
-        meta.CharField('python_module_name', maxlength=50),
-    )
-    ordering = ('package', 'name')
-    unique_together = (('package', 'python_module_name'),)
+    name = meta.CharField(maxlength=100)
+    meta.ForeignKey(Package, name='package')
+    python_module_name = meta.CharField(maxlength=50) 
 
+    class Meta:
+        db_table = 'content_types'
+        ordering = ('package', 'name')
+        unique_together = (('package', 'python_module_name'),)
+
     def __repr__(self):
         return "%s | %s" % (self.package, self.name)
 
@@ -54,49 +54,48 @@
         return self.get_model_module().get_object(**kwargs)
 
 class Redirect(meta.Model):
-    db_table = 'redirects'
-    fields = (
-        meta.ForeignKey(Site, radio_admin=meta.VERTICAL),
-        meta.CharField('old_path', 'redirect from', maxlength=200, db_index=True,
-            help_text="This should be an absolute path, excluding the domain name. Example: '/events/search/'."),
-        meta.CharField('new_path', 'redirect to', maxlength=200, blank=True,
-            help_text="This can be either an absolute path (as above) or a full URL starting with 'http://'."),
-    )
-    unique_together=(('site_id', 'old_path'),)
-    ordering = ('old_path',)
-    admin = meta.Admin(
-        list_display = ('__repr__',),
-        list_filter = ('site_id',),
-        search_fields = ('old_path', 'new_path'),
-    )
+    meta.ForeignKey(Site, radio_admin=meta.VERTICAL)
+    old_path = meta.CharField('redirect from', maxlength=200, db_index=True,
+            help_text="This should be an absolute path, excluding the domain name. Example: '/events/search/'.")
+    new_path = meta.CharField('redirect to', maxlength=200, blank=True,
+            help_text="This can be either an absolute path (as above) or a full URL starting with 'http://'.")
 
+    class Meta:
+        db_table = 'redirects'
+        unique_together=(('site_id', 'old_path'),)
+        ordering = ('old_path',)
+        admin = meta.Admin(
+            list_display = ('__repr__',),
+            list_filter = ('site_id',),
+            search_fields = ('old_path', 'new_path'),
+        )
+
     def __repr__(self):
         return "%s ---> %s" % (self.old_path, self.new_path)
 
 class FlatFile(meta.Model):
-    db_table = 'flatfiles'
-    fields = (
-        meta.CharField('url', 'URL', maxlength=100, validator_list=[validators.isAlphaNumericURL],
-            help_text="Example: '/about/contact/'. Make sure to have leading and trailing slashes."),
-        meta.CharField('title', maxlength=200),
-        meta.TextField('content', help_text="Full HTML is allowed."),
-        meta.BooleanField('enable_comments'),
-        meta.CharField('template_name', maxlength=70, blank=True,
-            help_text="Example: 'flatfiles/contact_page'. If this isn't provided, the system will use 'flatfiles/default'."),
-        meta.BooleanField('registration_required',
-            help_text="If this is checked, only logged-in users will be able to view the page."),
-        meta.ManyToManyField(Site),
-    )
-    ordering = ('url',)
-    admin = meta.Admin(
-        fields = (
-            (None, {'fields': ('url', 'title', 'content', 'sites')}),
-            ('Advanced options', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}),
-        ),
-        list_filter = ('sites',),
-        search_fields = ('url', 'title'),
-    )
+    url = meta.CharField('URL', maxlength=100, validator_list=[validators.isAlphaNumericURL],
+            help_text="Example: '/about/contact/'. Make sure to have leading and trailing slashes.")
+    title = meta.CharField(maxlength=200)
+    content = meta.TextField(help_text="Full HTML is allowed.")
+    enable_comments = meta.BooleanField()
+    template_name = meta.CharField(maxlength=70, blank=True,
+            help_text="Example: 'flatfiles/contact_page'. If this isn't provided, the system will use 'flatfiles/default'.")
+    registration_required = meta.BooleanField(help_text="If this is checked, only logged-in users will be able to view the page.")
+    meta.ManyToManyField(Site)
 
+    class Meta:
+        db_table = 'flatfiles'
+        ordering = ('url',)
+        admin = meta.Admin(
+            fields = (
+                (None, {'fields': ('url', 'title', 'content', 'sites')}),
+                ('Advanced options', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}),
+            ),
+            list_filter = ('sites',),
+            search_fields = ('url', 'title'),
+        )
+
     def __repr__(self):
         return "%s -- %s" % (self.url, self.title)
 
Index: django/models/auth.py
===================================================================
--- django/models/auth.py	(revision 389)
+++ django/models/auth.py	(working copy)
@@ -2,63 +2,60 @@
 from django.models import core
 
 class Permission(meta.Model):
-    fields = (
-        meta.CharField('name', maxlength=50),
-        meta.ForeignKey(core.Package, name='package'),
-        meta.CharField('codename', maxlength=100),
-    )
-    unique_together = (('package', 'codename'),)
-    ordering = ('package', 'codename')
+    name = meta.CharField(maxlength=50)
+    meta.ForeignKey(core.Package, name='package')
+    codename = meta.CharField(maxlength=100)
 
+    class Meta:
+        unique_together = (('package', 'codename'),)
+        ordering = ('package', 'codename')
+
     def __repr__(self):
         return "%s | %s" % (self.package, self.name)
 
 class Group(meta.Model):
-    fields = (
-        meta.CharField('name', maxlength=80, unique=True),
-        meta.ManyToManyField(Permission, blank=True, filter_interface=meta.HORIZONTAL),
-    )
-    ordering = ('name',)
-    admin = meta.Admin(
-        search_fields = ('name',),
-    )
+    name = meta.CharField(maxlength=80, unique=True)
 
+    class Meta:
+        ordering = ('name',)
+        admin = meta.Admin(
+            search_fields = ('name',),
+        )
+
     def __repr__(self):
         return self.name
 
 class User(meta.Model):
-    fields = (
-        meta.CharField('username', maxlength=30, unique=True,
-            validator_list=[validators.isAlphaNumeric]),
-        meta.CharField('first_name', maxlength=30, blank=True),
-        meta.CharField('last_name', maxlength=30, blank=True),
-        meta.EmailField('email', 'e-mail address', blank=True),
-        meta.CharField('password_md5', 'password', maxlength=32, help_text="Use an MD5 hash -- not the raw password."),
-        meta.BooleanField('is_staff', 'staff status',
-            help_text="Designates whether the user can log into this admin site."),
-        meta.BooleanField('is_active', 'active', default=True),
-        meta.BooleanField('is_superuser', 'superuser status'),
-        meta.DateTimeField('last_login', default=meta.LazyDate()),
-        meta.DateTimeField('date_joined', default=meta.LazyDate()),
-        meta.ManyToManyField(Group, blank=True,
-            help_text="In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."),
-        meta.ManyToManyField(Permission, name='user_permissions', blank=True, filter_interface=meta.HORIZONTAL),
-    )
-    ordering = ('username',)
-    exceptions = ('SiteProfileNotAvailable',)
-    admin = meta.Admin(
-        fields = (
-            (None, {'fields': ('username', 'password_md5')}),
-            ('Personal info', {'fields': ('first_name', 'last_name', 'email')}),
-            ('Permissions', {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}),
-            ('Important dates', {'fields': ('last_login', 'date_joined')}),
-            ('Groups', {'fields': ('groups',)}),
-        ),
-        list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff'),
-        list_filter = ('is_staff', 'is_superuser'),
-        search_fields = ('username', 'first_name', 'last_name', 'email'),
-    )
+    username = meta.CharField(maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric])
+    first_name = meta.CharField(maxlength=30, blank=True)
+    last_name = meta.CharField(maxlength=30, blank=True)
+    email = meta.EmailField('e-mail address', blank=True)
+    password_md5 = meta.CharField('password', maxlength=32, help_text="Use an MD5 hash -- not the raw password.")
+    is_staff = meta.BooleanField('staff status', help_text="Designates whether the user can log into this admin site.")
+    is_active = meta.BooleanField('active', default=True)
+    is_superuser = meta.BooleanField('superuser status')
+    last_login = meta.DateTimeField(default=meta.LazyDate())
+    date_joined = meta.DateTimeField(default=meta.LazyDate())
+    meta.ManyToManyField(Group, blank=True,
+            help_text="In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in.")
+    meta.ManyToManyField(Permission, name='user_permissions', blank=True, filter_interface=meta.HORIZONTAL)
 
+    class Meta:
+        ordering = ('username',)
+        exceptions = ('SiteProfileNotAvailable',)
+        admin = meta.Admin(
+            fields = (
+                (None, {'fields': ('username', 'password_md5')}),
+                ('Personal info', {'fields': ('first_name', 'last_name', 'email')}),
+                ('Permissions', {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}),
+                ('Important dates', {'fields': ('last_login', 'date_joined')}),
+                ('Groups', {'fields': ('groups',)}),
+            ),
+            list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff'),
+            list_filter = ('is_staff', 'is_superuser'),
+            search_fields = ('username', 'first_name', 'last_name', 'email'),
+        )
+
     def __repr__(self):
         return self.username
 
@@ -173,16 +170,16 @@
         return ''.join([choice(allowed_chars) for i in range(length)])
 
 class Session(meta.Model):
-    fields = (
-        meta.ForeignKey(User),
-        meta.CharField('session_md5', maxlength=32),
-        meta.DateTimeField('start_time', auto_now=True),
-    )
-    module_constants = {
-        'TEST_COOKIE_NAME': 'testcookie',
-        'TEST_COOKIE_VALUE': 'worked',
-    }
+    meta.ForeignKey(User)
+    session_md5 = meta.CharField(maxlength=32)
+    start_time = meta.DateTimeField(auto_now=True)
 
+    class Meta:
+        module_constants = {
+            'TEST_COOKIE_NAME': 'testcookie',
+            'TEST_COOKIE_VALUE': 'worked',
+        }
+
     def __repr__(self):
         return "session started at %s" % self.start_time
 
@@ -231,34 +228,32 @@
         response.set_cookie(key, value, domain=cookie_domain)
 
 class Message(meta.Model):
-    fields = (
-        meta.ForeignKey(User),
-        meta.TextField('message'),
-    )
+    meta.ForeignKey(User)
+    message = meta.TextField()
 
     def __repr__(self):
         return self.message
 
 class LogEntry(meta.Model):
-    module_name = 'log'
-    verbose_name_plural = 'log entries'
-    db_table = 'auth_admin_log'
-    fields = (
-        meta.DateTimeField('action_time', auto_now=True),
-        meta.ForeignKey(User),
-        meta.ForeignKey(core.ContentType, name='content_type_id', rel_name='content_type', blank=True, null=True),
-        meta.IntegerField('object_id', blank=True, null=True),
-        meta.CharField('object_repr', maxlength=200),
-        meta.PositiveSmallIntegerField('action_flag'),
-        meta.TextField('change_message', blank=True),
-    )
-    ordering = ('-action_time',)
-    module_constants = {
-        'ADDITION': 1,
-        'CHANGE': 2,
-        'DELETION': 3,
-    }
+    action_time = meta.DateTimeField(auto_now=True)
+    meta.ForeignKey(User)
+    meta.ForeignKey(core.ContentType, name='content_type_id', rel_name='content_type', blank=True, null=True)
+    object_id = meta.IntegerField(blank=True, null=True)
+    object_repr = meta.CharField(maxlength=200)
+    action_flag = meta.PositiveSmallIntegerField()
+    change_message = meta.TextField(blank=True)
 
+    class Meta:
+        module_name = 'log'
+        verbose_name_plural = 'log entries'
+        db_table = 'auth_admin_log'
+        ordering = ('-action_time',)
+        module_constants = {
+            'ADDITION': 1,
+            'CHANGE': 2,
+            'DELETION': 3,
+        }
+
     def __repr__(self):
         return str(self.action_time)
 
Index: django/core/meta/__init__.py
===================================================================
--- django/core/meta/__init__.py	(revision 389)
+++ django/core/meta/__init__.py	(working copy)
@@ -5,7 +5,7 @@
 from django.core.meta.fields import *
 from django.utils.functional import curry
 from django.utils.text import capfirst
-import copy, datetime, os, re, sys, types
+import copy, datetime, os, re, sys, types, inspect
 
 # Admin stages.
 ADD, CHANGE, BOTH = 1, 2, 3
@@ -196,11 +196,11 @@
         for f in self.fields:
             if f.primary_key:
                 self.pk = f
-                break
+
         # If a primary_key field hasn't been specified, add an
         # auto-incrementing primary-key ID field automatically.
         if self.pk is None:
-            self.fields.insert(0, AutoField('id', 'ID', primary_key=True))
+            self.fields.insert(0, AutoField(name='id', verbose_name='ID', primary_key=True))
             self.pk = self.fields[0]
 
     def __repr__(self):
@@ -372,34 +372,67 @@
         if not bases:
             return type.__new__(cls, name, bases, attrs)
 
+        # Use the attributes from the imbedded class 'Meta', if it exists.
+        if attrs.has_key('Meta'):
+            meta_attrs = attrs['Meta'].__dict__
+            del attrs['Meta']
+        else:
+            meta_attrs = {}
+
+        # In order to make sure that we only add fields that were created inside of this 
+        # class, we identify our model with a tuple containing the filename, and the class name.
+        model_ident = inspect.stack()[1][1], name
+
+        # Gather all of the attributes that are instances of Field.  Apply the attribute name as needed.
+        fields = []
+        for obj_name, obj in attrs.items():
+            if isinstance(obj, Field):
+                if isinstance(obj,(ForeignKey, ManyToManyField, OneToOneField)):
+                    obj.rel.name = obj_name
+                else:
+                    obj.set_name(obj_name)
+                fields.append(obj)
+                del Field.instance_bank[model_ident][id(obj)]
+                del attrs[obj_name]
+
+        # Gather the fields that were not assigned to an attribute.  
+        for obj_id, obj in Field.instance_bank[model_ident].items():
+            fields.append(obj)
+            del Field.instance_bank[model_ident][obj_id]
+
+        # Sort the fields in the order that they were created.
+        fields.sort(lambda x,y: x.creation_counter - y.creation_counter)
+
         # If this model is a subclass of another Model, create an Options
         # object by first copying the base class's _meta and then updating it
         # with the overrides from this class.
         replaces_module = None
         if bases[0] != Model:
-            if not attrs.has_key('fields'):
-                attrs['fields'] = list(bases[0]._meta._orig_init_args['fields'][:])
-            if attrs.has_key('ignore_fields'):
-                ignore_fields = attrs.pop('ignore_fields')
+            # Inherent fields from the parent.  In order to allow for overrides, we must make
+            # sure that we don't duplicate a name.
+            field_names = [f.name for f in fields]
+            for f in bases[0]._meta._orig_init_args['fields']:
+                if not f.name in field_names:
+                    fields.append(f)
+            if meta_attrs.has_key('ignore_fields'):
+                ignore_fields = meta_attrs.pop('ignore_fields')
                 new_fields = []
-                for i, f in enumerate(attrs['fields']):
+                for f in fields:
                     if f.name not in ignore_fields:
                         new_fields.append(f)
-                attrs['fields'] = new_fields
-            if attrs.has_key('add_fields'):
-                attrs['fields'].extend(attrs.pop('add_fields'))
-            if attrs.has_key('replaces_module'):
+                fields = new_fields
+            if meta_attrs.has_key('replaces_module'):
                 # Set the replaces_module variable for now. We can't actually
                 # do anything with it yet, because the module hasn't yet been
                 # created.
-                replaces_module = attrs.pop('replaces_module').split('.')
+                replaces_module = meta_attrs.pop('replaces_module').split('.')
             # Pass any Options overrides to the base's Options instance, and
-            # simultaneously remove them from attrs. When this is done, attrs
+            # simultaneously remove them from meta_attrs. When this is done, meta_attrs
             # will be a dictionary of custom methods, plus __module__.
-            meta_overrides = {}
-            for k, v in attrs.items():
-                if not callable(v) and k != '__module__':
-                    meta_overrides[k] = attrs.pop(k)
+            meta_overrides = {'fields':fields}
+            for k, v in meta_attrs.items():
+                if k != '__module__':
+                    meta_overrides[k] = meta_attrs.pop(k)
             opts = bases[0]._meta.copy(**meta_overrides)
             opts.object_name = name
             del meta_overrides
@@ -408,26 +441,26 @@
                 # If the module_name wasn't given, use the class name
                 # in lowercase, plus a trailing "s" -- a poor-man's
                 # pluralization.
-                module_name = attrs.pop('module_name', name.lower() + 's'),
+                module_name = meta_attrs.pop('module_name', name.lower() + 's'),
                 # If the verbose_name wasn't given, use the class name,
                 # converted from InitialCaps to "lowercase with spaces".
-                verbose_name = attrs.pop('verbose_name',
+                verbose_name = meta_attrs.pop('verbose_name',
                     re.sub('([A-Z])', ' \\1', name).lower().strip()),
-                verbose_name_plural = attrs.pop('verbose_name_plural', ''),
-                db_table = attrs.pop('db_table', ''),
-                fields = attrs.pop('fields'),
-                ordering = attrs.pop('ordering', None),
-                unique_together = attrs.pop('unique_together', None),
-                admin = attrs.pop('admin', None),
-                has_related_links = attrs.pop('has_related_links', False),
-                where_constraints = attrs.pop('where_constraints', None),
+                verbose_name_plural = meta_attrs.pop('verbose_name_plural', ''),
+                db_table = meta_attrs.pop('db_table', ''),
+                fields = fields,
+                ordering = meta_attrs.pop('ordering', None),
+                unique_together = meta_attrs.pop('unique_together', None),
+                admin = meta_attrs.pop('admin', None),
+                has_related_links = meta_attrs.pop('has_related_links', False),
+                where_constraints = meta_attrs.pop('where_constraints', None),
                 object_name = name,
-                app_label = attrs.pop('app_label', None),
-                exceptions = attrs.pop('exceptions', None),
-                permissions = attrs.pop('permissions', None),
-                get_latest_by = attrs.pop('get_latest_by', None),
-                order_with_respect_to = attrs.pop('order_with_respect_to', None),
-                module_constants = attrs.pop('module_constants', None),
+                app_label = meta_attrs.pop('app_label', None),
+                exceptions = meta_attrs.pop('exceptions', None),
+                permissions = meta_attrs.pop('permissions', None),
+                get_latest_by = meta_attrs.pop('get_latest_by', None),
+                order_with_respect_to = meta_attrs.pop('order_with_respect_to', None),
+                module_constants = meta_attrs.pop('module_constants', None),
             )
 
         # Dynamically create the module that will contain this class and its
@@ -450,6 +483,9 @@
         for k, v in attrs.items():
             if k in ('__module__', '__init__', '_overrides', '__doc__'):
                 continue # Skip the important stuff.
+            # Make sure that this is a function, and give a helpful error otherwise.
+            if not callable(v):
+                raise ValueError("All attributes of a Model must be either a Field instance or a function.  %s is a %s." % (k, type(v)))
             # Give the function a function attribute "custom" to designate that
             # it's a custom function/method.
             v.custom = True
Index: django/core/meta/fields.py
===================================================================
--- django/core/meta/fields.py	(revision 389)
+++ django/core/meta/fields.py	(working copy)
@@ -3,7 +3,7 @@
 from django.core.exceptions import ObjectDoesNotExist
 from django.utils.functional import curry
 from django.utils.text import capfirst
-import datetime, os
+import datetime, os, inspect
 
 # Random entropy string used by "default" param.
 NOT_PROVIDED = 'oijpwojefiojpanv'
@@ -46,18 +46,25 @@
 
 class Field(object):
 
+    # Stores field instances.
+    instance_bank = {}
+
+    # Will be increased each time a Field object is instanced.  Used to
+    # retain the order of fields.
+    creation_counter = 0
+
     # Designates whether empty strings fundamentally are allowed at the
     # database level.
     empty_strings_allowed = True
 
-    def __init__(self, name, verbose_name=None, primary_key=False,
+    def __init__(self, verbose_name=None, 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 = name
-        self.verbose_name = verbose_name or name.replace('_', ' ')
+        self.verbose_name = verbose_name or name and name.replace('_', ' ')
         self.primary_key = primary_key
         self.maxlength, self.unique = maxlength, unique
         self.blank, self.null = blank, null
@@ -82,6 +89,33 @@
         else:
             self.db_index = db_index
 
+        # Save the field instance, so that it can be retrieved later (in case it wasn't assigned to anything.)
+        # We will identify the class by a tuple containing the filename it was defined in, and it's own name.
+        # This is to make sure that a model only gets fields that were created inside of it's class.
+        stack = inspect.stack()
+        try:
+            # Walk up the stack until we find a name other than '__init__'.
+            while stack[0][3] == "__init__":
+                stack.pop(0)
+            model_ident = stack[0][1],stack[0][3]
+        finally:
+            del stack
+        if not Field.instance_bank.has_key(model_ident):
+            Field.instance_bank[model_ident] = {}
+        Field.instance_bank[model_ident][id(self)] = self
+
+        # Increase the creation counter, and save our local copy.
+        self.creation_counter = Field.creation_counter
+        Field.creation_counter += 1
+
+    def set_name(self, name):
+        """
+        Sets the name, as well as the verbose_name if it is None.  (Should be called when the 
+        name is not availible at creation time.)
+        """
+        self.name = name
+        self.verbose_name = self.verbose_name or self.name.replace('_',' ')
+
     def pre_save(self, obj, value, add):
         """
         Hook for altering the object obj based on the value of this field and
@@ -267,11 +301,11 @@
 
 class DateField(Field):
     empty_strings_allowed = False
-    def __init__(self, name, verbose_name=None, auto_now=False, auto_now_add=False, **kwargs):
+    def __init__(self, verbose_name=None, 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
-        Field.__init__(self, name, verbose_name, **kwargs)
+        Field.__init__(self, verbose_name, name, **kwargs)
 
     def get_db_prep_lookup(self, lookup_type, value):
         if lookup_type == 'range':
@@ -323,9 +357,9 @@
         return [formfields.EmailField]
 
 class FileField(Field):
-    def __init__(self, name, verbose_name=None, upload_to='', **kwargs):
+    def __init__(self, verbose_name=None, name=None, upload_to='', **kwargs):
         self.upload_to = upload_to
-        Field.__init__(self, name, verbose_name, **kwargs)
+        Field.__init__(self, verbose_name, name, **kwargs)
 
     def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False):
         field_list = Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel)
@@ -388,17 +422,17 @@
 
 class FloatField(Field):
     empty_strings_allowed = False
-    def __init__(self, name, verbose_name=None, max_digits=None, decimal_places=None, **kwargs):
+    def __init__(self, verbose_name=None, 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)
+        Field.__init__(self, verbose_name, name, **kwargs)
 
     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=None, width_field=None, height_field=None, **kwargs):
+    def __init__(self, verbose_name=None, 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)
+        FileField.__init__(self, verbose_name, name, **kwargs)
 
     def get_manipulator_field_objs(self):
         return [formfields.ImageUploadField, formfields.HiddenField]
@@ -470,11 +504,11 @@
 
 class TimeField(Field):
     empty_strings_allowed = False
-    def __init__(self, name, verbose_name=None, auto_now=False, auto_now_add=False, **kwargs):
+    def __init__(self, verbose_name=None, 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
-        Field.__init__(self, name, verbose_name, **kwargs)
+        Field.__init__(self, verbose_name, name, **kwargs)
 
     def get_db_prep_lookup(self, lookup_type, value):
         if lookup_type == 'range':
@@ -497,10 +531,10 @@
         return [formfields.TimeField]
 
 class URLField(Field):
-    def __init__(self, name, verbose_name=None, verify_exists=True, **kwargs):
+    def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
         if verify_exists:
             kwargs.setdefault('validator_list', []).append(validators.isExistingURL)
-        Field.__init__(self, name, verbose_name, **kwargs)
+        Field.__init__(self, verbose_name, name, **kwargs)
 
     def get_manipulator_field_objs(self):
         return [formfields.URLField]
@@ -510,9 +544,9 @@
         return [formfields.USStateField]
 
 class XMLField(Field):
-    def __init__(self, name, verbose_name=None, schema_path=None, **kwargs):
+    def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
         self.schema_path = schema_path
-        Field.__init__(self, name, verbose_name, **kwargs)
+        Field.__init__(self, verbose_name, name, **kwargs)
 
     def get_manipulator_field_objs(self):
         return [curry(formfields.XMLLargeTextField, schema_path=self.schema_path)]
Index: tests/testapp/models/repr.py
===================================================================
--- tests/testapp/models/repr.py	(revision 389)
+++ tests/testapp/models/repr.py	(working copy)
@@ -11,10 +11,8 @@
 from django.core import meta
 
 class Article(meta.Model):
-    fields = (
-        meta.CharField('headline', maxlength=100),
-        meta.DateTimeField('pub_date'),
-    )
+    headline = meta.CharField(maxlength=100)
+    pub_date = meta.DateTimeField()
 
     def __repr__(self):
         return self.headline
Index: tests/testapp/models/ordering.py
===================================================================
--- tests/testapp/models/ordering.py	(revision 389)
+++ tests/testapp/models/ordering.py	(working copy)
@@ -16,12 +16,12 @@
 from django.core import meta
 
 class Article(meta.Model):
-    fields = (
-        meta.CharField('headline', maxlength=100),
-        meta.DateTimeField('pub_date'),
-    )
-    ordering = ('-pub_date', 'headline')
+    headline = meta.CharField(maxlength=100)
+    pub_date = meta.DateTimeField()
 
+    class Meta:
+        ordering = ('-pub_date', 'headline')
+
     def __repr__(self):
         return self.headline
 
Index: tests/testapp/models/lookup.py
===================================================================
--- tests/testapp/models/lookup.py	(revision 389)
+++ tests/testapp/models/lookup.py	(working copy)
@@ -7,12 +7,12 @@
 from django.core import meta
 
 class Article(meta.Model):
-    fields = (
-        meta.CharField('headline', maxlength=100),
-        meta.DateTimeField('pub_date'),
-    )
-    ordering = ('-pub_date', 'headline')
+    headline = meta.CharField(maxlength=100)
+    pub_date = meta.DateTimeField()
 
+    class Meta:
+        ordering = ('-pub_date', 'headline')
+
     def __repr__(self):
         return self.headline
 
Index: tests/testapp/models/many_to_many.py
===================================================================
--- tests/testapp/models/many_to_many.py	(revision 389)
+++ tests/testapp/models/many_to_many.py	(working copy)
@@ -10,18 +10,14 @@
 from django.core import meta
 
 class Publication(meta.Model):
-    fields = (
-        meta.CharField('title', maxlength=30),
-    )
+    title = meta.CharField(maxlength=30)
 
     def __repr__(self):
         return self.title
 
 class Article(meta.Model):
-    fields = (
-        meta.CharField('headline', maxlength=100),
-        meta.ManyToManyField(Publication),
-    )
+    headline = meta.CharField(maxlength=100)
+    meta.ManyToManyField(Publication)
 
     def __repr__(self):
         return self.headline
Index: tests/testapp/models/get_latest.py
===================================================================
--- tests/testapp/models/get_latest.py	(revision 389)
+++ tests/testapp/models/get_latest.py	(working copy)
@@ -11,12 +11,12 @@
 from django.core import meta
 
 class Article(meta.Model):
-    fields = (
-        meta.CharField('headline', maxlength=100),
-        meta.DateTimeField('pub_date'),
-    )
-    get_latest_by = 'pub_date'
+    headline = meta.CharField(maxlength=100)
+    pub_date = meta.DateTimeField()
 
+    class Meta:
+        get_latest_by = 'pub_date'
+
     def __repr__(self):
         return self.headline
 
Index: tests/testapp/models/custom_methods.py
===================================================================
--- tests/testapp/models/custom_methods.py	(revision 389)
+++ tests/testapp/models/custom_methods.py	(working copy)
@@ -23,10 +23,8 @@
 from django.core import meta
 
 class Article(meta.Model):
-    fields = (
-        meta.CharField('headline', maxlength=100),
-        meta.DateField('pub_date'),
-    )
+    headline = meta.CharField(maxlength=100)
+    pub_date = meta.DateField()
 
     def __repr__(self):
         return self.headline
Index: tests/testapp/models/basic.py
===================================================================
--- tests/testapp/models/basic.py	(revision 389)
+++ tests/testapp/models/basic.py	(working copy)
@@ -7,11 +7,10 @@
 from django.core import meta
 
 class Article(meta.Model):
-    fields = (
-        meta.CharField('headline', maxlength=100, default='Default headline'),
-        meta.DateTimeField('pub_date'),
-    )
+    headline = meta.CharField(maxlength=100, default='Default headline')
+    pub_date = meta.DateTimeField()
 
+
 API_TESTS = """
 # No articles are in the system yet.
 >>> articles.get_list()
Index: tests/testapp/models/m2o_recursive.py
===================================================================
--- tests/testapp/models/m2o_recursive.py	(revision 389)
+++ tests/testapp/models/m2o_recursive.py	(working copy)
@@ -15,12 +15,11 @@
 from django.core import meta
 
 class Category(meta.Model):
-    module_name = 'categories'
-    fields = (
-        meta.CharField('name', maxlength=20),
-        meta.ForeignKey('self', null=True,
-            rel_name='parent', related_name='child'),
-    )
+    name = meta.CharField(maxlength=20)
+    parent = meta.ForeignKey('self', null=True, related_name='child')
+    
+    class Meta:
+       module_name = 'categories'
 
     def __repr__(self):
         return self.name
Index: tests/testapp/models/one_to_one.py
===================================================================
--- tests/testapp/models/one_to_one.py	(revision 389)
+++ tests/testapp/models/one_to_one.py	(working copy)
@@ -9,20 +9,16 @@
 from django.core import meta
 
 class Place(meta.Model):
-    fields = (
-        meta.CharField('name', maxlength=50),
-        meta.CharField('address', maxlength=80),
-    )
+    name = meta.CharField(maxlength=50)
+    address = meta.CharField(maxlength=80)
 
     def __repr__(self):
         return "%s the place" % self.name
 
 class Restaurant(meta.Model):
-    fields = (
-        meta.OneToOneField(Place),
-        meta.BooleanField('serves_hot_dogs'),
-        meta.BooleanField('serves_pizza'),
-    )
+    meta.OneToOneField(Place)
+    serves_hot_dogs = meta.BooleanField()
+    serves_pizza = meta.BooleanField()
 
     def __repr__(self):
         return "%s the restaurant" % self.get_place().name
Index: tests/testapp/models/m2o_recursive2.py
===================================================================
--- tests/testapp/models/m2o_recursive2.py	(revision 389)
+++ tests/testapp/models/m2o_recursive2.py	(working copy)
@@ -14,13 +14,9 @@
 from django.core import meta
 
 class Person(meta.Model):
-    fields = (
-        meta.CharField('full_name', maxlength=20),
-        meta.ForeignKey('self', null=True, rel_name='mother',
-            related_name='mothers_child'),
-        meta.ForeignKey('self', null=True, rel_name='father',
-            related_name='fathers_child'),
-    )
+    full_name = meta.CharField(maxlength=20)
+    mother = meta.ForeignKey('self', null=True, related_name='mothers_child')
+    father = meta.ForeignKey('self', null=True, related_name='fathers_child')
 
     def __repr__(self):
         return self.full_name
Index: tests/testapp/models/many_to_one.py
===================================================================
--- tests/testapp/models/many_to_one.py	(revision 389)
+++ tests/testapp/models/many_to_one.py	(working copy)
@@ -7,20 +7,16 @@
 from django.core import meta
 
 class Reporter(meta.Model):
-    fields = (
-        meta.CharField('first_name', maxlength=30),
-        meta.CharField('last_name', maxlength=30),
-    )
+    first_name = meta.CharField(maxlength=30)
+    last_name = meta.CharField(maxlength=30)
 
     def __repr__(self):
         return "%s %s" % (self.first_name, self.last_name)
 
 class Article(meta.Model):
-    fields = (
-        meta.CharField('headline', maxlength=100),
-        meta.DateField('pub_date'),
-        meta.ForeignKey(Reporter),
-    )
+    headline = meta.CharField(maxlength=100)
+    pub_date = meta.DateField()
+    meta.ForeignKey(Reporter)
 
     def __repr__(self):
         return self.headline
Index: tests/testapp/models/m2m_intermediary.py
===================================================================
--- tests/testapp/models/m2m_intermediary.py	(revision 389)
+++ tests/testapp/models/m2m_intermediary.py	(working copy)
@@ -13,29 +13,23 @@
 from django.core import meta
 
 class Reporter(meta.Model):
-    fields = (
-        meta.CharField('first_name', maxlength=30),
-        meta.CharField('last_name', maxlength=30),
-    )
+    first_name = meta.CharField(maxlength=30)
+    last_name = meta.CharField(maxlength=30)
 
     def __repr__(self):
         return "%s %s" % (self.first_name, self.last_name)
 
 class Article(meta.Model):
-    fields = (
-        meta.CharField('headline', maxlength=100),
-        meta.DateField('pub_date'),
-    )
+    headline = meta.CharField(maxlength=100)
+    pub_date = meta.DateField()
 
     def __repr__(self):
         return self.headline
 
 class Writer(meta.Model):
-    fields = (
-        meta.ForeignKey(Reporter),
-        meta.ForeignKey(Article),
-        meta.CharField('position', maxlength=100),
-    )
+    meta.ForeignKey(Reporter)
+    meta.ForeignKey(Article)
+    position = meta.CharField(maxlength=100)
 
     def __repr__(self):
         return '%r (%s)' % (self.get_reporter(), self.position)
