      def get_breadcrumbs(self, request):
          return get_breadcrumbs(request.path, request)
  
      def get_filter_form(self, data, view, request):
          if not hasattr(view, 'get_queryset') or not hasattr(view, 'filter_backends'):
              return
  
          # Infer if this is a list view or not.
          paginator = getattr(view, 'paginator', None)
 
</s> remove     description = view_cls.__doc__ or ''
 </s> add     # Description may be set by some Views, such as a ViewSet.
    description = getattr(view, 'description', None)
    if description is None:
        description = view.__class__.__doc__ or ''
 </s> remove         return super(ExampleViewSet, self).list(self, request)
 </s> add         raise NotImplementedError </s> remove         return super(ExampleSerializer, self).retrieve(self, request)
 </s> add         raise NotImplementedError </s> remove     name = view_cls.__name__
 </s> add     # Name may be set by some Views, such as a ViewSet.
    name = getattr(view, 'name', None)
    if name is not None:
        return name

    name = view.__class__.__name__ </s> remove def action(methods=None, detail=None, url_path=None, url_name=None, **kwargs):
 </s> add def action(methods=None, detail=None, name=None, url_path=None, url_name=None, **kwargs):
    def get_extra_actions(self, view):
        if hasattr(view, 'get_extra_action_url_map'):
            return view.get_extra_action_url_map()
        return None

      def get_breadcrumbs(self, request):
          return get_breadcrumbs(request.path, request)
  
    def get_extra_actions(self, view):
        if hasattr(view, 'get_extra_action_url_map'):
            return view.get_extra_action_url_map()
        return None

      def get_filter_form(self, data, view, request):
          if not hasattr(view, 'get_queryset') or not hasattr(view, 'filter_backends'):
              return
  
          # Infer if this is a list view or not.
          paginator = getattr(view, 'paginator', None)
keep keep add keep keep keep keep keep keep
 Improvements to ViewSet extra actions (#5605)

* View suffix already set by initializer

* Add 'name' and 'description' attributes to ViewSet

ViewSets may now provide their `name` and `description` attributes
directly, instead of relying on view introspection to derive them.
These attributes may also be provided with the view's initkwargs.

The ViewSet `name` and `suffix` initkwargs are mutually exclusive.

The `action` decorator now provides the `name` and `description` to
the view's initkwargs. By default, these values are derived from the
method name and its docstring. The `name` may be overridden by providing
it as an argument to the decorator.

The `get_view_name` and `get_view_description` hooks now provide the
view instance to the handler, instead of the view class. The default
implementations of these handlers now respect the `name`/`description`.

* Add 'extra actions' to ViewSet & browsable APIs

* Update simple router tests

Removed old test logic around link/action decorators from `v2.3`. Also
simplified the test by making the results explicit instead of computed.

* Add method mapping to ViewSet actions

* Document extra action method mapping 
rest_framework/renderers.py