diff --git a/django/bin/django-admin.py b/django/bin/django-admin.py index 25bcdcf4247..347b4322c88 100755 --- a/django/bin/django-admin.py +++ b/django/bin/django-admin.py @@ -51,7 +51,7 @@ def get_sql_create(mod): table_output = [] for f in opts.fields: if isinstance(f, meta.ForeignKey): - rel_field = f.rel.to.get_field(f.rel.field_name) + rel_field = f.rel.get_related_field() # If the foreign key points to an AutoField, the foreign key # should be an IntegerField, not an AutoField. Otherwise, the # foreign key should be the same type of field as the field diff --git a/django/core/meta.py b/django/core/meta.py index 596fbb19056..cc21f8cc59c 100644 --- a/django/core/meta.py +++ b/django/core/meta.py @@ -179,23 +179,7 @@ class Options: else: self.order_with_respect_to = None self.module_constants = module_constants or {} - # Alter the admin attribute so that the 'fields' members are lists of - # field objects -- not lists of field names. - if admin: - # Be sure to use admin.copy(), because otherwise we'll be editing a - # reference of admin, which will in turn affect the copy in - # self._orig_init_args. - self.admin = admin.copy() - for fieldset in self.admin.fields: - admin_fields = [] - for field_name_or_list in fieldset[1]['fields']: - if isinstance(field_name_or_list, basestring): - admin_fields.append([self.get_field(field_name_or_list)]) - else: - admin_fields.append([self.get_field(field_name) for field_name in field_name_or_list]) - fieldset[1]['fields'] = admin_fields - else: - self.admin = None + self.admin = admin # Calculate one_to_one_field. self.one_to_one_field = None @@ -508,6 +492,9 @@ class ModelBase(type): # RECURSIVE_RELATIONSHIP_CONSTANT, create that relationship formally. if f.rel and f.rel.to == RECURSIVE_RELATIONSHIP_CONSTANT: f.rel.to = opts + f.name = (f.rel.name or f.rel.to.object_name.lower()) + '_' + f.rel.to.pk.name + f.verbose_name = f.verbose_name or f.rel.to.verbose_name + f.rel.field_name = f.rel.field_name or f.rel.to.pk.name # Add "get_thingie" methods for many-to-one related objects. # EXAMPLES: Choice.get_poll(), Story.get_dateline() if isinstance(f.rel, ManyToOne): @@ -2041,8 +2028,9 @@ class ForeignKey(Field): try: to_name = to._meta.object_name.lower() except AttributeError: # to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT - kwargs['name'] = kwargs['name'] - kwargs['verbose_name'] = kwargs['verbose_name'] + assert to == 'self', "ForeignKey(%r) is invalid. First parameter to ForeignKey must be either a model or the string %r" % (to, RECURSIVE_RELATIONSHIP_CONSTANT) + kwargs['name'] = '' + kwargs['verbose_name'] = kwargs.get('verbose_name', '') else: to_field = to_field or to._meta.pk.name kwargs['name'] = kwargs.get('name', to_name + '_id') @@ -2158,5 +2146,19 @@ class Admin: self.search_fields = search_fields or [] self.save_on_top = save_on_top - def copy(self): - return copy.deepcopy(self) + def get_field_objs(self, opts): + # Returns self.fields, except with fields as Field objects instead of + # field names. + new_fieldset_list = [] + for fieldset in self.fields: + new_fieldset = [fieldset[0], {}] + new_fieldset[1].update(fieldset[1]) + admin_fields = [] + for field_name_or_list in fieldset[1]['fields']: + if isinstance(field_name_or_list, basestring): + admin_fields.append([opts.get_field(field_name_or_list)]) + else: + admin_fields.append([opts.get_field(field_name) for field_name in field_name_or_list]) + new_fieldset[1]['fields'] = admin_fields + new_fieldset_list.append(new_fieldset) + return new_fieldset_list diff --git a/django/views/admin/main.py b/django/views/admin/main.py index 5b06db0ae5d..166170731ca 100644 --- a/django/views/admin/main.py +++ b/django/views/admin/main.py @@ -551,7 +551,7 @@ def _get_template(opts, app_label, add=False, change=False, show_delete=False, f javascript_imports.extend(['%sjs/getElementsBySelector.js' % ADMIN_MEDIA_PREFIX, '%sjs/dom-drag.js' % ADMIN_MEDIA_PREFIX, '%sjs/admin/ordering.js' % ADMIN_MEDIA_PREFIX]) if opts.admin.js: javascript_imports.extend(opts.admin.js) - for _, options in opts.admin.fields: + for _, options in opts.admin.get_field_objs(opts): try: for field_list in options['fields']: for f in field_list: @@ -589,7 +589,7 @@ def _get_template(opts, app_label, add=False, change=False, show_delete=False, f if opts.admin.save_on_top: t.extend(_get_submit_row_template(opts, app_label, add, change, show_delete, ordered_objects)) t.append('{% if form.error_dict %}

Please correct the error{{ form.error_dict.items|pluralize }} below.

{% endif %}\n') - for fieldset_name, options in opts.admin.fields: + for fieldset_name, options in opts.admin.get_field_objs(opts): t.append('
\n\n' % options.get('classes', '')) if fieldset_name: t.append('

%s

\n' % fieldset_name) @@ -671,7 +671,7 @@ def _get_template(opts, app_label, add=False, change=False, show_delete=False, f if add: # Add focus to the first field on the form, if this is an "add" form. t.append('' % \ - opts.admin.fields[0][1]['fields'][0][0].get_manipulator_field_names('')[0]) + opts.admin.get_field_objs(opts)[0][1]['fields'][0][0].get_manipulator_field_names('')[0]) if auto_populated_fields: t.append('