فهرست منبع

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.
Tim Graham 11 سال پیش
والد
کامیت
5840445664
2فایلهای تغییر یافته به همراه27 افزوده شده و 2 حذف شده
  1. 4 2
      docs/topics/auth/default.txt
  2. 23 0
      docs/topics/class-based-views/intro.txt

+ 4 - 2
docs/topics/auth/default.txt

@@ -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
docs/topics/class-based-views/intro.txt

@@ -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
 =====================================