     attributes not discoverable by normal mechanisms), you can simply remove the
     ``get_all_members()`` method. The default implementation on ``LazyObject``
     will do the right thing.
  
   * If you have more complex requirements for introspection, first rename the
     ``get_all_members()`` method to ``__dir__()``. This is the standard method,
     from Python 2.6 onwards, for supporting introspection. If you require
     support for Python < 2.6, add the following code to the class::
  
         __members__ = property(lambda self: self.__dir__())
  
  
  .. _specifying-databases:
 
</s> remove ``LazyObject`` is an undocumented utility class used for lazily wrapping other
objects of unknown type. In Django 1.1 and earlier, it handled introspection in
a non-standard way, depending on wrapped objects implementing a public method
``get_all_members()``. Since this could easily lead to name clashes, it has been
changed to use the standard method, involving ``__members__`` and ``__dir__()``.
If you used ``LazyObject`` in your own code and implemented the
``get_all_members()`` method for wrapped objects, you need to make the following
changes:
 </s> add ``LazyObject`` is an undocumented utility class used for lazily
wrapping other objects of unknown type. In Django 1.1 and earlier, it
handled introspection in a non-standard way, depending on wrapped
objects implementing a public method named
``get_all_members()``. Since this could easily lead to name clashes,
it has been changed to use the standard Python introspection method,
involving ``__members__`` and ``__dir__()``.  If you used
``LazyObject`` in your own code and implemented the
``get_all_members()`` method for wrapped objects, you need to make the
following changes: </s> remove 'Smart' if tag
--------------
 </s> add "Smart" :ttag:`if` tag
---------------------- </s> remove    requires the use of the csrf_token template tag in the template. If you
 </s> add    requires the use of the ``csrf_token`` template tag in the template. If you </s> remove ``django.contrib.auth.decorators`` provides the decorators ``login_required``,
``permission_required`` and ``user_passes_test``. Previously it was possible to
use these decorators both on functions (where the first argument is 'request')
and on methods (where the first argument is 'self', and the second argument is
'request'). However, we have found that the trick which enabled this is
flawed. It only works in limited circumstances, and produces errors that are
very difficult to debug when it does not work.

For this reason, the 'auto adapt' behaviour has been removed, and if you are
using these decorators on methods, you will need to manually apply
:func:`django.utils.decorators.method_decorator` to convert the decorator to one
that works with methods. You would change code from this::
 </s> add ``django.contrib.auth.decorators`` provides the decorators
``login_required``, ``permission_required`` and
``user_passes_test``. Previously it was possible to use these
decorators both on functions (where the first argument is 'request')
and on methods (where the first argument is 'self', and the second
argument is 'request'). Unfortunately, flaws were discovered in the
code supporting this: it only works in limited circumstances, and
produces errors that are very difficult to debug when it does not
work.

For this reason, the 'auto adapt' behavior has been removed, and if
you are using these decorators on methods, you will need to manually
apply :func:`django.utils.decorators.method_decorator` to convert the
decorator to one that works with methods. For example, you would
change code from this:: </s> remove definitions to use the new prototype now, just to get it over with.
 </s> add definitions to use the new prototype as soon as possible.
 * If you have more complex requirements for introspection, first
   rename the ``get_all_members()`` method to ``__dir__()``. This is
   the standard method, from Python 2.6 onwards, for supporting
   introspection. If you require support for Python versions earlier
   than 2.6, add the following code to the class::
     attributes not discoverable by normal mechanisms), you can simply remove the
     ``get_all_members()`` method. The default implementation on ``LazyObject``
     will do the right thing.
  
 * If you have more complex requirements for introspection, first
   rename the ``get_all_members()`` method to ``__dir__()``. This is
   the standard method, from Python 2.6 onwards, for supporting
   introspection. If you require support for Python versions earlier
   than 2.6, add the following code to the class::
 * If you have more complex requirements for introspection, first
   rename the ``get_all_members()`` method to ``__dir__()``. This is
   the standard method, from Python 2.6 onwards, for supporting
   introspection. If you require support for Python versions earlier
   than 2.6, add the following code to the class::
 * If you have more complex requirements for introspection, first
   rename the ``get_all_members()`` method to ``__dir__()``. This is
   the standard method, from Python 2.6 onwards, for supporting
   introspection. If you require support for Python versions earlier
   than 2.6, add the following code to the class::
 * If you have more complex requirements for introspection, first
   rename the ``get_all_members()`` method to ``__dir__()``. This is
   the standard method, from Python 2.6 onwards, for supporting
   introspection. If you require support for Python versions earlier
   than 2.6, add the following code to the class::
  
         __members__ = property(lambda self: self.__dir__())
  
  
  .. _specifying-databases:
keep keep keep keep replace replace replace replace keep keep keep keep keep
 Update 1.2 release notes in anticipation of final release.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@13259 bcc190cf-cafb-0310-a4f2-bffc1f526a37 
docs/releases/1.2.txt