diff --git a/django/core/meta.py b/django/core/meta.py index 189114219d..5c8d070f40 100644 --- a/django/core/meta.py +++ b/django/core/meta.py @@ -2136,7 +2136,7 @@ class OneToOne(ManyToOne): self.raw_id_admin = raw_id_admin class Admin: - def __init__(self, fields, js=None, list_display=None, list_filter=None, date_hierarchy=None, + def __init__(self, fields=None, js=None, list_display=None, list_filter=None, date_hierarchy=None, save_as=False, ordering=None, search_fields=None, save_on_top=False): self.fields = fields self.js = js or [] @@ -2148,10 +2148,17 @@ class Admin: self.save_on_top = save_on_top def get_field_objs(self, opts): - # Returns self.fields, except with fields as Field objects instead of - # field names. + """ + Returns self.fields, except with fields as Field objects instead of + field names. If self.fields is None, defaults to putting every + non-AutoField field with editable=True in a single fieldset. + """ + if self.fields is None: + field_struct = ((None, {'fields': [f.name for f in opts.fields + opts.many_to_many if f.editable and not isinstance(f, AutoField)]}),) + else: + field_struct = self.fields new_fieldset_list = [] - for fieldset in self.fields: + for fieldset in field_struct: new_fieldset = [fieldset[0], {}] new_fieldset[1].update(fieldset[1]) admin_fields = [] diff --git a/django/models/auth.py b/django/models/auth.py index 4d3f6394a1..516ec112df 100644 --- a/django/models/auth.py +++ b/django/models/auth.py @@ -20,9 +20,6 @@ class Group(meta.Model): ) ordering = (('name', 'ASC'),) admin = meta.Admin( - fields = ( - (None, {'fields': ('name', 'permissions')}), - ), search_fields = ('name',), ) diff --git a/django/models/core.py b/django/models/core.py index 4416f22b76..bdf4567e6a 100644 --- a/django/models/core.py +++ b/django/models/core.py @@ -65,9 +65,6 @@ class Redirect(meta.Model): unique_together=(('site_id', 'old_path'),) ordering = (('old_path', 'ASC'),) admin = meta.Admin( - fields = ( - (None, {'fields': ('site_id', 'old_path', 'new_path')}), - ), list_display = ('__repr__',), list_filter = ('site_id',), search_fields = ('old_path', 'new_path'), diff --git a/docs/model-api.txt b/docs/model-api.txt index e52ca8b43d..a2cfade854 100644 --- a/docs/model-api.txt +++ b/docs/model-api.txt @@ -304,9 +304,9 @@ Field Types many toppings on a pizza):: meta.ForeignKey(Pizza) - + .. admonition:: Note - + To create a recursive relationship, use a ``ForeignKey`` that relates to ``"self"`` (i.e. ``meta.ForeignKey("self")``). @@ -568,7 +568,7 @@ Admin options The ``admin`` field in the model tells Django how to construct the admin interface for the object. The field is an instance of the ``meta.Admin`` -object, which has the following options (of which only ``fields`` is required): +object, which has the following options. All are optional. ``date_hierarchy`` To allow filtering of objects in the admin by date, set ``date_hierarchy`` @@ -616,6 +616,11 @@ object, which has the following options (of which only ``fields`` is required): .. image:: http://media.djangoproject.com/img/doc/flatfiles_admin.png + If ``fields`` isn't given but a model does define ``admin`` as a + ``meta.Admin`` object, Django will default to displaying each field that + isn't an ``AutoField`` and has ``editable=True``, in a single fieldset, in + the same order as the ``fields`` in the model. + ``js`` A list of strings representing URLs of JavaScript files to link into the admin screen. This can be used to tweak a given type of admin page in JS or diff --git a/docs/overview.txt b/docs/overview.txt index 1453b70964..86f089778d 100644 --- a/docs/overview.txt +++ b/docs/overview.txt @@ -138,15 +138,7 @@ classes:: meta.TextField('article'), meta.ForeignKey(Reporter), ) - admin = meta.Admin( - fields = ( - (None, {'fields': ('headline', 'article')}), - ('Extra stuff', {'fields': ('pub_date', 'reporter_id')}), - ), - ) - -The ``admin.fields`` defines the layout of your admin form. Each element in the -fields tuple corresponds to a ``
`` in the form. + admin = meta.Admin() The philosophy here is that your site is edited by a staff, or a client, or maybe just you -- and you don't want to have to deal with creating backend diff --git a/docs/tutorial02.txt b/docs/tutorial02.txt index 0c96c5c12d..7c03c71c1f 100644 --- a/docs/tutorial02.txt +++ b/docs/tutorial02.txt @@ -92,11 +92,7 @@ file and make the following change to add an ``admin`` attribute:: fields = ( # ... ) - admin = meta.Admin( - fields = ( - (None, {'fields': ('question', 'pub_date')}), - ), - ) + admin = meta.Admin() Restart your development Web server, and reload the Django admin page. You'll have to restart the server each time you make a change to Python code -- but @@ -163,8 +159,8 @@ Customize the admin form Take a few minutes to marvel at all the code you didn't have to write. -Let's customize this a bit. We can reorder the fields by changing the -order of the field names in the ``admin`` attribute of the model:: +Let's customize this a bit. We can reorder the fields by explicitly adding a +``fields`` parameter to ``meta.Admin``:: admin = meta.Admin( fields = ( @@ -226,15 +222,7 @@ Here's what that would look like:: class Choice(meta.Model): # ... - admin = meta.Admin( - fields = ( - (None, {'fields': ('poll_id', 'choice', 'votes')}), - ), - ) - -(Note that we used "poll_id" to refer to the ``ForeignKey(Poll)`` field. The -field name is automatically calculated from the model's class name, lowercased, -plus '_id'.) + admin = meta.Admin() Now "Choices" is an available option in the Django admin. The "Add choice" form looks like this: @@ -318,9 +306,6 @@ on the change list page for the object:: class Poll(meta.Model): # ... admin = meta.Admin( - fields = ( - (None, {'fields': ('question', 'pub_date')}), - ), list_display = ('question', 'pub_date'), )