@@ -124,8 +124,23 @@ def action(methods=None, detail=None, url_path=None, url_name=None, **kwargs):
124
124
"""
125
125
Mark a ViewSet method as a routable action.
126
126
127
- Set the `detail` boolean to determine if this action should apply to
128
- instance/detail requests or collection/list requests.
127
+ `@action`-decorated functions will be endowed with a `mapping` property,
128
+ a `MethodMapper` that can be used to add additional method-based behaviors
129
+ on the routed action.
130
+
131
+ :param methods: A list of HTTP method names this action responds to.
132
+ Defaults to GET only.
133
+ :param detail: Required. Determines whether this action applies to
134
+ instance/detail requests or collection/list requests.
135
+ :param url_path: Define the URL segment for this action. Defaults to the
136
+ name of the method decorated.
137
+ :param url_name: Define the internal (`reverse`) URL name for this action.
138
+ Defaults to the name of the method decorated with underscores
139
+ replaced with dashes.
140
+ :param kwargs: Additional properties to set on the view. This can be used
141
+ to override viewset-level *_classes settings, equivalent to
142
+ how the `@renderer_classes` etc. decorators work for function-
143
+ based API views.
129
144
"""
130
145
methods = ['get' ] if (methods is None ) else methods
131
146
methods = [method .lower () for method in methods ]
@@ -144,6 +159,10 @@ def decorator(func):
144
159
func .detail = detail
145
160
func .url_path = url_path if url_path else func .__name__
146
161
func .url_name = url_name if url_name else func .__name__ .replace ('_' , '-' )
162
+
163
+ # These kwargs will end up being passed to `ViewSet.as_view()` within
164
+ # the router, which eventually delegates to Django's CBV `View`,
165
+ # which assigns them as instance attributes for each request.
147
166
func .kwargs = kwargs
148
167
149
168
# Set descriptive arguments for viewsets
0 commit comments