Commit 58404456 authored by Tim Graham's avatar Tim Graham
Browse files

Fixed #22006 -- Documented how to write a login_required mixin for CBVs.

Thanks django at patjack.co.uk for the suggestion and mockforest
for the draft patch.
parent ad43fdaa
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -564,14 +564,16 @@ The permission_required decorator
        The :func:`~django.contrib.auth.decorators.permission_required`
        decorator can take a list of permissions as well as a single permission.

.. _applying-permissions-to-generic-views:

Applying permissions to generic views
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To apply a permission to a :doc:`class-based generic view
</ref/class-based-views/index>`, decorate the :meth:`View.dispatch
<django.views.generic.base.View.dispatch>` method on the class. See
:ref:`decorating-class-based-views` for details.

:ref:`decorating-class-based-views` for details. Another approach is to
:ref:`write a mixin that wraps as_view() <mixins_that_wrap_as_view>`.

.. _built-in-auth-views:

+23 −0
Original line number Diff line number Diff line
@@ -173,6 +173,29 @@ that inherits from ``View`` - for example, trying to use a form at the top of a
list and combining :class:`~django.views.generic.edit.ProcessFormView` and
:class:`~django.views.generic.list.ListView` - won't work as expected.

.. _mixins_that_wrap_as_view:

Mixins that wrap ``as_view()``
------------------------------

One way to apply common behavior to many classes is to write a mixin that wraps
the :meth:`~django.views.generic.base.View.as_view()` method.

For example, if you have many generic views that should be decorated with
:func:`~django.contrib.auth.decorators.login_required` you could implement a
mixin like this::

    from django.contrib.auth.decorators import login_required

    class LoginRequiredMixin(object):
        @classmethod
        def as_view(cls):
            return login_required(super(LoginRequiredMixin, cls).as_view())

    class MyView(LoginRequiredMixin, ...):
        # this is a generic view
        ...

Handling forms with class-based views
=====================================