mirror of
				https://github.com/django/django.git
				synced 2025-11-04 13:39:16 +00:00 
			
		
		
		
	Fixed #15003 - assorted edits to admin docs; thanks adamv.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@15166 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		
							parent
							
								
									614672d365
								
							
						
					
					
						commit
						30c8a5574a
					
				
					 1 changed files with 154 additions and 158 deletions
				
			
		| 
						 | 
					@ -11,13 +11,6 @@ interface that content producers can immediately use to start adding content to
 | 
				
			||||||
the site. In this document, we discuss how to activate, use and customize
 | 
					the site. In this document, we discuss how to activate, use and customize
 | 
				
			||||||
Django's admin interface.
 | 
					Django's admin interface.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. admonition:: Note
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    The admin site has been refactored significantly since Django 0.96. This
 | 
					 | 
				
			||||||
    document describes the newest version of the admin site, which allows for
 | 
					 | 
				
			||||||
    much richer customization. If you follow the development of Django itself,
 | 
					 | 
				
			||||||
    you may have heard this described as "newforms-admin."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Overview
 | 
					Overview
 | 
				
			||||||
========
 | 
					========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,8 +19,8 @@ There are six steps in activating the Django admin site:
 | 
				
			||||||
    1. Add ``'django.contrib.admin'`` to your :setting:`INSTALLED_APPS`
 | 
					    1. Add ``'django.contrib.admin'`` to your :setting:`INSTALLED_APPS`
 | 
				
			||||||
       setting.
 | 
					       setting.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    2. Admin has two dependencies - ``django.contrib.auth`` and
 | 
					    2. Admin has two dependencies - :mod:`django.contrib.auth` and
 | 
				
			||||||
       ``django.contrib.contenttypes``. If these applications are not
 | 
					       :mod:`django.contrib.contenttypes`. If these applications are not
 | 
				
			||||||
       in your :setting:`INSTALLED_APPS` list, add them.
 | 
					       in your :setting:`INSTALLED_APPS` list, add them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    3. Determine which of your application's models should be editable in the
 | 
					    3. Determine which of your application's models should be editable in the
 | 
				
			||||||
| 
						 | 
					@ -87,7 +80,7 @@ Other topics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            admin.site.register(Author)
 | 
					            admin.site.register(Author)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
``ModelAdmin`` Options
 | 
					``ModelAdmin`` options
 | 
				
			||||||
----------------------
 | 
					----------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The ``ModelAdmin`` is very flexible. It has several options for dealing with
 | 
					The ``ModelAdmin`` is very flexible. It has several options for dealing with
 | 
				
			||||||
| 
						 | 
					@ -97,6 +90,26 @@ subclass::
 | 
				
			||||||
    class AuthorAdmin(admin.ModelAdmin):
 | 
					    class AuthorAdmin(admin.ModelAdmin):
 | 
				
			||||||
        date_hierarchy = 'pub_date'
 | 
					        date_hierarchy = 'pub_date'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. attribute:: ModelAdmin.actions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    A list of actions to make available on the change list page. See
 | 
				
			||||||
 | 
					    :doc:`/ref/contrib/admin/actions` for details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. attribute:: ModelAdmin.actions_on_top
 | 
				
			||||||
 | 
					.. attribute:: ModelAdmin.actions_on_bottom
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Controls where on the page the actions bar appears. By default, the admin
 | 
				
			||||||
 | 
					    changelist displays actions at the top of the page (``actions_on_top = True;
 | 
				
			||||||
 | 
					    actions_on_bottom = False``).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. attribute:: ModelAdmin.actions_selection_counter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. versionadded:: 1.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Controls whether a selection counter is display next to the action dropdown.
 | 
				
			||||||
 | 
					    By default, the admin changelist will display it
 | 
				
			||||||
 | 
					    (``actions_selection_counter = True``).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. attribute:: ModelAdmin.date_hierarchy
 | 
					.. attribute:: ModelAdmin.date_hierarchy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Set ``date_hierarchy`` to the name of a ``DateField`` or ``DateTimeField``
 | 
					    Set ``date_hierarchy`` to the name of a ``DateField`` or ``DateTimeField``
 | 
				
			||||||
| 
						 | 
					@ -113,14 +126,55 @@ subclass::
 | 
				
			||||||
    e.g. if all the dates are in one month, it'll show the day-level
 | 
					    e.g. if all the dates are in one month, it'll show the day-level
 | 
				
			||||||
    drill-down only.
 | 
					    drill-down only.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. attribute:: ModelAdmin.form
 | 
					.. attribute:: ModelAdmin.exclude
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    By default a ``ModelForm`` is dynamically created for your model. It is
 | 
					    This attribute, if given, should be a list of field names to exclude from
 | 
				
			||||||
    used to create the form presented on both the add/change pages. You can
 | 
					    the form.
 | 
				
			||||||
    easily provide your own ``ModelForm`` to override any default form behavior
 | 
					 | 
				
			||||||
    on the add/change pages.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    For an example see the section `Adding custom validation to the admin`_.
 | 
					    For example, let's consider the following model::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class Author(models.Model):
 | 
				
			||||||
 | 
					            name = models.CharField(max_length=100)
 | 
				
			||||||
 | 
					            title = models.CharField(max_length=3)
 | 
				
			||||||
 | 
					            birth_date = models.DateField(blank=True, null=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If you want a form for the ``Author`` model that includes only the ``name``
 | 
				
			||||||
 | 
					    and ``title`` fields, you would specify ``fields`` or ``exclude`` like
 | 
				
			||||||
 | 
					    this::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class AuthorAdmin(admin.ModelAdmin):
 | 
				
			||||||
 | 
					            fields = ('name', 'title')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class AuthorAdmin(admin.ModelAdmin):
 | 
				
			||||||
 | 
					            exclude = ('birth_date',)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Since the Author model only has three fields, ``name``, ``title``, and
 | 
				
			||||||
 | 
					    ``birth_date``, the forms resulting from the above declarations will
 | 
				
			||||||
 | 
					    contain exactly the same fields.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. attribute:: ModelAdmin.fields
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Use this option as an alternative to ``fieldsets`` if the layout does not
 | 
				
			||||||
 | 
					    matter and if you want to only show a subset of the available fields in the
 | 
				
			||||||
 | 
					    form. For example, you could define a simpler version of the admin form for
 | 
				
			||||||
 | 
					    the ``django.contrib.flatpages.FlatPage`` model as follows::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class FlatPageAdmin(admin.ModelAdmin):
 | 
				
			||||||
 | 
					            fields = ('url', 'title', 'content')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    In the above example, only the fields 'url', 'title' and 'content' will be
 | 
				
			||||||
 | 
					    displayed, sequentially, in the form.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. versionadded:: 1.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ``fields`` can contain values defined in :attr:`ModelAdmin.readonly_fields`
 | 
				
			||||||
 | 
					    to be displayed as read-only.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. admonition:: Note
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        This ``fields`` option should not be confused with the ``fields``
 | 
				
			||||||
 | 
					        dictionary key that is within the ``fieldsets`` option, as described in
 | 
				
			||||||
 | 
					        the previous section.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. attribute:: ModelAdmin.fieldsets
 | 
					.. attribute:: ModelAdmin.fieldsets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -207,56 +261,6 @@ subclass::
 | 
				
			||||||
            ``django.utils.html.escape()`` to escape any HTML special
 | 
					            ``django.utils.html.escape()`` to escape any HTML special
 | 
				
			||||||
            characters.
 | 
					            characters.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. attribute:: ModelAdmin.fields
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Use this option as an alternative to ``fieldsets`` if the layout does not
 | 
					 | 
				
			||||||
    matter and if you want to only show a subset of the available fields in the
 | 
					 | 
				
			||||||
    form. For example, you could define a simpler version of the admin form for
 | 
					 | 
				
			||||||
    the ``django.contrib.flatpages.FlatPage`` model as follows::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        class FlatPageAdmin(admin.ModelAdmin):
 | 
					 | 
				
			||||||
            fields = ('url', 'title', 'content')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    In the above example, only the fields 'url', 'title' and 'content' will be
 | 
					 | 
				
			||||||
    displayed, sequentially, in the form.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. versionadded:: 1.2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ``fields`` can contain values defined in :attr:`ModelAdmin.readonly_fields`
 | 
					 | 
				
			||||||
    to be displayed as read-only.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. admonition:: Note
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        This ``fields`` option should not be confused with the ``fields``
 | 
					 | 
				
			||||||
        dictionary key that is within the ``fieldsets`` option, as described in
 | 
					 | 
				
			||||||
        the previous section.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. attribute:: ModelAdmin.exclude
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This attribute, if given, should be a list of field names to exclude from
 | 
					 | 
				
			||||||
    the form.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    For example, let's consider the following model::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        class Author(models.Model):
 | 
					 | 
				
			||||||
            name = models.CharField(max_length=100)
 | 
					 | 
				
			||||||
            title = models.CharField(max_length=3)
 | 
					 | 
				
			||||||
            birth_date = models.DateField(blank=True, null=True)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    If you want a form for the ``Author`` model that includes only the ``name``
 | 
					 | 
				
			||||||
    and ``title`` fields, you would specify ``fields`` or ``exclude`` like
 | 
					 | 
				
			||||||
    this::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        class AuthorAdmin(admin.ModelAdmin):
 | 
					 | 
				
			||||||
            fields = ('name', 'title')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        class AuthorAdmin(admin.ModelAdmin):
 | 
					 | 
				
			||||||
            exclude = ('birth_date',)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Since the Author model only has three fields, ``name``, ``title``, and
 | 
					 | 
				
			||||||
    ``birth_date``, the forms resulting from the above declarations will
 | 
					 | 
				
			||||||
    contain exactly the same fields.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. attribute:: ModelAdmin.filter_horizontal
 | 
					.. attribute:: ModelAdmin.filter_horizontal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Use a nifty unobtrusive JavaScript "filter" interface instead of the
 | 
					    Use a nifty unobtrusive JavaScript "filter" interface instead of the
 | 
				
			||||||
| 
						 | 
					@ -269,6 +273,61 @@ subclass::
 | 
				
			||||||
    Same as ``filter_horizontal``, but is a vertical display of the filter
 | 
					    Same as ``filter_horizontal``, but is a vertical display of the filter
 | 
				
			||||||
    interface.
 | 
					    interface.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. attribute:: ModelAdmin.form
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    By default a ``ModelForm`` is dynamically created for your model. It is
 | 
				
			||||||
 | 
					    used to create the form presented on both the add/change pages. You can
 | 
				
			||||||
 | 
					    easily provide your own ``ModelForm`` to override any default form behavior
 | 
				
			||||||
 | 
					    on the add/change pages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    For an example see the section `Adding custom validation to the admin`_.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. attribute:: ModelAdmin.formfield_overrides
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This provides a quick-and-dirty way to override some of the
 | 
				
			||||||
 | 
					    :class:`~django.forms.Field` options for use in the admin.
 | 
				
			||||||
 | 
					    ``formfield_overrides`` is a dictionary mapping a field class to a dict of
 | 
				
			||||||
 | 
					    arguments to pass to the field at construction time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Since that's a bit abstract, let's look at a concrete example. The most
 | 
				
			||||||
 | 
					    common use of ``formfield_overrides`` is to add a custom widget for a
 | 
				
			||||||
 | 
					    certain type of field. So, imagine we've written a ``RichTextEditorWidget``
 | 
				
			||||||
 | 
					    that we'd like to use for large text fields instead of the default
 | 
				
			||||||
 | 
					    ``<textarea>``. Here's how we'd do that::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        from django.db import models
 | 
				
			||||||
 | 
					        from django.contrib import admin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Import our custom widget and our model from where they're defined
 | 
				
			||||||
 | 
					        from myapp.widgets import RichTextEditorWidget
 | 
				
			||||||
 | 
					        from myapp.models import MyModel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class MyModelAdmin(admin.ModelAdmin):
 | 
				
			||||||
 | 
					            formfield_overrides = {
 | 
				
			||||||
 | 
					                models.TextField: {'widget': RichTextEditorWidget},
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Note that the key in the dictionary is the actual field class, *not* a
 | 
				
			||||||
 | 
					    string. The value is another dictionary; these arguments will be passed to
 | 
				
			||||||
 | 
					    :meth:`~django.forms.Field.__init__`. See :doc:`/ref/forms/api` for
 | 
				
			||||||
 | 
					    details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. warning::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        If you want to use a custom widget with a relation field (i.e.
 | 
				
			||||||
 | 
					        :class:`~django.db.models.ForeignKey` or
 | 
				
			||||||
 | 
					        :class:`~django.db.models.ManyToManyField`), make sure you haven't
 | 
				
			||||||
 | 
					        included that field's name in ``raw_id_fields`` or ``radio_fields``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ``formfield_overrides`` won't let you change the widget on relation
 | 
				
			||||||
 | 
					        fields that have ``raw_id_fields`` or ``radio_fields`` set. That's
 | 
				
			||||||
 | 
					        because ``raw_id_fields`` and ``radio_fields`` imply custom widgets of
 | 
				
			||||||
 | 
					        their own.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. attribute:: ModelAdmin.inlines
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    See :class:`InlineModelAdmin` objects below.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. attribute:: ModelAdmin.list_display
 | 
					.. attribute:: ModelAdmin.list_display
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Set ``list_display`` to control which fields are displayed on the change
 | 
					    Set ``list_display`` to control which fields are displayed on the change
 | 
				
			||||||
| 
						 | 
					@ -496,15 +555,11 @@ subclass::
 | 
				
			||||||
    regardless of this setting if one of the ``list_display`` fields is a
 | 
					    regardless of this setting if one of the ``list_display`` fields is a
 | 
				
			||||||
    ``ForeignKey``.
 | 
					    ``ForeignKey``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. attribute:: ModelAdmin.inlines
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    See :class:`InlineModelAdmin` objects below.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. attribute:: ModelAdmin.ordering
 | 
					.. attribute:: ModelAdmin.ordering
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Set ``ordering`` to specify how lists of objects should be ordered in the
 | 
					    Set ``ordering`` to specify how lists of objects should be ordered in the
 | 
				
			||||||
    Django admin views. This should be a list or tuple in the same format as a
 | 
					    Django admin views. This should be a list or tuple in the same format as a
 | 
				
			||||||
    model's ``ordering`` parameter.
 | 
					    model's :attr:`~django.db.models.Options.ordering` parameter.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    If this isn't provided, the Django admin will use the model's default
 | 
					    If this isn't provided, the Django admin will use the model's default
 | 
				
			||||||
    ordering.
 | 
					    ordering.
 | 
				
			||||||
| 
						 | 
					@ -674,68 +729,6 @@ subclass::
 | 
				
			||||||
        Performs a full-text match. This is like the default search method but
 | 
					        Performs a full-text match. This is like the default search method but
 | 
				
			||||||
        uses an index. Currently this is only available for MySQL.
 | 
					        uses an index. Currently this is only available for MySQL.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. attribute:: ModelAdmin.formfield_overrides
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This provides a quick-and-dirty way to override some of the
 | 
					 | 
				
			||||||
    :class:`~django.forms.Field` options for use in the admin.
 | 
					 | 
				
			||||||
    ``formfield_overrides`` is a dictionary mapping a field class to a dict of
 | 
					 | 
				
			||||||
    arguments to pass to the field at construction time.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Since that's a bit abstract, let's look at a concrete example. The most
 | 
					 | 
				
			||||||
    common use of ``formfield_overrides`` is to add a custom widget for a
 | 
					 | 
				
			||||||
    certain type of field. So, imagine we've written a ``RichTextEditorWidget``
 | 
					 | 
				
			||||||
    that we'd like to use for large text fields instead of the default
 | 
					 | 
				
			||||||
    ``<textarea>``. Here's how we'd do that::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        from django.db import models
 | 
					 | 
				
			||||||
        from django.contrib import admin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Import our custom widget and our model from where they're defined
 | 
					 | 
				
			||||||
        from myapp.widgets import RichTextEditorWidget
 | 
					 | 
				
			||||||
        from myapp.models import MyModel
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        class MyModelAdmin(admin.ModelAdmin):
 | 
					 | 
				
			||||||
            formfield_overrides = {
 | 
					 | 
				
			||||||
                models.TextField: {'widget': RichTextEditorWidget},
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Note that the key in the dictionary is the actual field class, *not* a
 | 
					 | 
				
			||||||
    string. The value is another dictionary; these arguments will be passed to
 | 
					 | 
				
			||||||
    :meth:`~django.forms.Field.__init__`. See :doc:`/ref/forms/api` for
 | 
					 | 
				
			||||||
    details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. warning::
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        If you want to use a custom widget with a relation field (i.e.
 | 
					 | 
				
			||||||
        :class:`~django.db.models.ForeignKey` or
 | 
					 | 
				
			||||||
        :class:`~django.db.models.ManyToManyField`), make sure you haven't
 | 
					 | 
				
			||||||
        included that field's name in ``raw_id_fields`` or ``radio_fields``.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        ``formfield_overrides`` won't let you change the widget on relation
 | 
					 | 
				
			||||||
        fields that have ``raw_id_fields`` or ``radio_fields`` set. That's
 | 
					 | 
				
			||||||
        because ``raw_id_fields`` and ``radio_fields`` imply custom widgets of
 | 
					 | 
				
			||||||
        their own.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. attribute:: ModelAdmin.actions
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    A list of actions to make available on the change list page. See
 | 
					 | 
				
			||||||
    :doc:`/ref/contrib/admin/actions` for details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. attribute:: ModelAdmin.actions_on_top
 | 
					 | 
				
			||||||
.. attribute:: ModelAdmin.actions_on_bottom
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Controls where on the page the actions bar appears. By default, the admin
 | 
					 | 
				
			||||||
    changelist displays actions at the top of the page (``actions_on_top = True;
 | 
					 | 
				
			||||||
    actions_on_bottom = False``).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. attribute:: ModelAdmin.actions_selection_counter
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. versionadded:: 1.2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Controls whether a selection counter is display next to the action dropdown.
 | 
					 | 
				
			||||||
    By default, the admin changelist will display it
 | 
					 | 
				
			||||||
    (``actions_selection_counter = True``).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Custom template options
 | 
					Custom template options
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1043,8 +1036,8 @@ on your ``ModelAdmin``::
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            js = ("my_code.js",)
 | 
					            js = ("my_code.js",)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Keep in mind that this will be prepended with ``MEDIA_URL``. The same rules
 | 
					Keep in mind that this will be prepended with :setting:`MEDIA_URL`. The same
 | 
				
			||||||
apply as :doc:`regular media definitions on forms </topics/forms/media>`.
 | 
					rules apply as :doc:`regular media definitions on forms </topics/forms/media>`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Django admin Javascript makes use of the `jQuery`_ library. To avoid
 | 
					Django admin Javascript makes use of the `jQuery`_ library. To avoid
 | 
				
			||||||
conflict with user scripts, Django's jQuery is namespaced as
 | 
					conflict with user scripts, Django's jQuery is namespaced as
 | 
				
			||||||
| 
						 | 
					@ -1255,17 +1248,18 @@ automatically::
 | 
				
			||||||
            FriendshipInline,
 | 
					            FriendshipInline,
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Working with Many-to-Many Models
 | 
					Working with many-to-many models
 | 
				
			||||||
--------------------------------
 | 
					--------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. versionadded:: 1.2
 | 
					.. versionadded:: 1.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
By default, admin widgets for many-to-many relations will be displayed
 | 
					By default, admin widgets for many-to-many relations will be displayed
 | 
				
			||||||
on whichever model contains the actual reference to the ``ManyToManyField``.
 | 
					on whichever model contains the actual reference to the
 | 
				
			||||||
Depending on your ``ModelAdmin`` definition, each many-to-many field in your
 | 
					:class:`~django.db.models.ManyToManyField`. Depending on your ``ModelAdmin``
 | 
				
			||||||
model will be represented by a standard HTML ``<select multiple>``, a
 | 
					definition, each many-to-many field in your model will be represented by a
 | 
				
			||||||
horizontal or vertical filter, or a ``raw_id_admin`` widget. However, it is
 | 
					standard HTML ``<select multiple>``, a horizontal or vertical filter, or a
 | 
				
			||||||
also possible to to replace these widgets with inlines.
 | 
					``raw_id_admin`` widget. However, it is also possible to to replace these
 | 
				
			||||||
 | 
					widgets with inlines.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Suppose we have the following models::
 | 
					Suppose we have the following models::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1311,14 +1305,15 @@ In all other respects, the ``InlineModelAdmin`` is exactly the same as any
 | 
				
			||||||
other. You can customize the appearance using any of the normal
 | 
					other. You can customize the appearance using any of the normal
 | 
				
			||||||
``ModelAdmin`` properties.
 | 
					``ModelAdmin`` properties.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Working with Many-to-Many Intermediary Models
 | 
					Working with many-to-many intermediary models
 | 
				
			||||||
----------------------------------------------
 | 
					---------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
When you specify an intermediary model using the ``through`` argument to a
 | 
					When you specify an intermediary model using the ``through`` argument to a
 | 
				
			||||||
``ManyToManyField``, the admin will not display a widget by default. This is
 | 
					:class:`~django.db.models.ManyToManyField`, the admin will not display a
 | 
				
			||||||
because each instance of that intermediary model requires more information
 | 
					widget by default. This is because each instance of that intermediary model
 | 
				
			||||||
than could be displayed in a single widget, and the layout required for
 | 
					requires more information than could be displayed in a single widget, and the
 | 
				
			||||||
multiple widgets will vary depending on the intermediate model.
 | 
					layout required for multiple widgets will vary depending on the intermediate
 | 
				
			||||||
 | 
					model.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
However, we still want to be able to edit that information inline. Fortunately,
 | 
					However, we still want to be able to edit that information inline. Fortunately,
 | 
				
			||||||
this is easy to do with inline admin models. Suppose we have the following
 | 
					this is easy to do with inline admin models. Suppose we have the following
 | 
				
			||||||
| 
						 | 
					@ -1407,7 +1402,7 @@ other inline. In your ``admin.py`` for this example app::
 | 
				
			||||||
See the :doc:`contenttypes documentation </ref/contrib/contenttypes>` for more
 | 
					See the :doc:`contenttypes documentation </ref/contrib/contenttypes>` for more
 | 
				
			||||||
specific information.
 | 
					specific information.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Overriding Admin Templates
 | 
					Overriding admin templates
 | 
				
			||||||
==========================
 | 
					==========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It is relatively easy to override many of the templates which the admin module
 | 
					It is relatively easy to override many of the templates which the admin module
 | 
				
			||||||
| 
						 | 
					@ -1422,7 +1417,7 @@ directory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In order to override one or more of them, first create an ``admin`` directory
 | 
					In order to override one or more of them, first create an ``admin`` directory
 | 
				
			||||||
in your project's ``templates`` directory. This can be any of the directories
 | 
					in your project's ``templates`` directory. This can be any of the directories
 | 
				
			||||||
you specified in ``TEMPLATE_DIRS``.
 | 
					you specified in :setting:`TEMPLATE_DIRS`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Within this ``admin`` directory, create sub-directories named after your app.
 | 
					Within this ``admin`` directory, create sub-directories named after your app.
 | 
				
			||||||
Within these app subdirectories create sub-directories named after your models.
 | 
					Within these app subdirectories create sub-directories named after your models.
 | 
				
			||||||
| 
						 | 
					@ -1548,10 +1543,10 @@ Templates can override or extend base admin templates as described in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Path to a custom template that will be used by the admin site login view.
 | 
					    Path to a custom template that will be used by the admin site login view.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. versionadded:: 1.3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. attribute:: AdminSite.login_form
 | 
					.. attribute:: AdminSite.login_form
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. versionadded:: 1.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Subclass of :class:`~django.contrib.auth.forms.AuthenticationForm` that
 | 
					    Subclass of :class:`~django.contrib.auth.forms.AuthenticationForm` that
 | 
				
			||||||
    will be used by the admin site login view.
 | 
					    will be used by the admin site login view.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1652,13 +1647,14 @@ a pattern for your new view.
 | 
				
			||||||
.. note::
 | 
					.. note::
 | 
				
			||||||
    Any view you render that uses the admin templates, or extends the base
 | 
					    Any view you render that uses the admin templates, or extends the base
 | 
				
			||||||
    admin template, should provide the ``current_app`` argument to
 | 
					    admin template, should provide the ``current_app`` argument to
 | 
				
			||||||
    ``RequestContext`` or ``Context`` when rendering the template.  It should
 | 
					    :class:`~django.template.RequestContext` or :class:`~django.template.Context`
 | 
				
			||||||
    be set to either ``self.name`` if your view is on an ``AdminSite`` or
 | 
					    when rendering the template.  It should be set to either ``self.name`` if
 | 
				
			||||||
    ``self.admin_site.name`` if your view is on a ``ModelAdmin``.
 | 
					    your view is on an ``AdminSite`` or ``self.admin_site.name`` if your view
 | 
				
			||||||
 | 
					    is on a ``ModelAdmin``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. _admin-reverse-urls:
 | 
					.. _admin-reverse-urls:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Reversing Admin URLs
 | 
					Reversing admin URLs
 | 
				
			||||||
====================
 | 
					====================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
When an :class:`AdminSite` is deployed, the views provided by that site are
 | 
					When an :class:`AdminSite` is deployed, the views provided by that site are
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue